[ 簡単な説明 ] 複素数演算の関数ライブラリです。複素数は、"sslib.h" 内で定義した Complex 型の構造体で表します。 Complex 型の数値 a の実数部、虚数部はそれぞれ、a.r、a.i で参照できます。 ライブラリには、四則演算及び基本的な関数を準備しています。 基本的な関数は数学公式の通りに計算しています。 |
関数名 | 関数の機能 | 呼び出し例 | |
cadd( ) | 四則演算 | 加算 | c = cadd(a, b); |
csub( ) | 減算 | c = csub(a, b); | |
cmul( ) | 乗算 | c = cmul(a, b); | |
cmul1( ) | 乗算(対 double) | c = cmul1(a, x); | |
cdiv( ) | 除算 | c = cdiv(a, b); | |
cdiv1( ) | 除算(対 double) | c = cdiv1(a, x); | |
cln( ) | 対数関数 | 自然対数 | c = cln(a); |
clog10( ) | 常用対数 | c = clog10(a); | |
cexp( ) | 指数関数 | c = cexp(a); | |
cpow( ) | ベキ乗 | Complex 乗 | c = cpow(a, b); |
cpowd( ) | double 乗 | c = cpowd(a, x); | |
csin( ) | 三角関数 | 正弦関数 | c = csin(a); |
ccos( ) | 余弦関数 | c = ccos(a); | |
ctan( ) | 正接関数 | c = ctan(a); | |
csqrt( ) | 平方根 | c = csqrt(a); | |
tocomplex( ) | double → Complex データ変換 | c = tocomplex(xr, xi); | |
conj( ) | 複素共役 | c = conj(a); | |
cfunc( ) | 代数多項式の値計算 | c = cfunc(a, n, x); | |
cabslt( ) | 絶対値 | x = cabslt(a); | |
carg( ) | 偏角 | t = carg(a); | |
cne( ) | 判定 | 異値判定 | if(cne(a, b)) ... |
ceq( ) | 等値判定 | if(cwq(a, b)) ... |
/* complex.c */ #include <stdio.h> #include "sslib.h" Complex cadd(Complex a, Complex b) { return tocomplex(a.r + b.r, a.i + b.i); } Complex csub(Complex a, Complex b) { return tocomplex(a.r - b.r, a.i - b.i); } Complex cmul(Complex a, Complex b) { return tocomplex(a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r); } Complex cmul1(Complex a, double k) { return tocomplex(a.r * k, a.i * k); } Complex cdiv(Complex a, Complex b) { double w; if(ceq(a, b)) return tocomplex(1., 0.); w = b.r * b.r + b.i * b.i; if(w == 0) { fprintf(stderr, "Error : Divide by 0 in cdiv()\n"); return tocomplex(0., 0.); } return tocomplex((a.r * b.r + a.i * b.i) / w, (a.i * b.r - a.r * b.i) / w); } Complex cdiv1(Complex a, double k) { if(k == 0.) { fprintf(stderr, "Error : Divide by 0 in cdiv1()\n"); return tocomplex(0., 0.); } return tocomplex(a.r / k, a.i / k); } Complex cln(Complex a) { return tocomplex(log(cabslt(a)), carg(a)); } Complex clog10(Complex a) { return cmul(tocomplex(M_LOG10E, 0.), cln(a)); } Complex cexp(Complex a) { double x; x = exp(a.r); return tocomplex(x * cos(a.i), x * sin(a.i)); } Complex cpow(Complex a, Complex b) { return cexp(cmul(cln(a), b)); } Complex cpowd(Complex a, double n) { double w, t; t = carg(a) * n; w = pow(cabslt(a), n); return tocomplex(w * cos(t), w * sin(t)); } Complex csin(Complex a) { double ar; if(fabs(a.r) > 2. * M_PI) ar = (int)(a.r / 2. / M_PI) * 2. * M_PI; else ar = a.r; return tocomplex(sin(ar) * cosh(a.i), cos(ar) * sinh(a.i)); } Complex ccos(Complex a) { double ar; if(fabs(a.r) > 2. * M_PI) ar = (int)(a.r / 2. / M_PI) * 2. * M_PI; else ar = a.r; return tocomplex(cos(ar) * cosh(a.i), - sin(ar) * sinh(a.i)); } Complex ctan(Complex a) { Complex x; if(fabs(a.r) > 2. * M_PI) a.r = (int)(a.r / 2. / M_PI) * 2. * M_PI; x = tocomplex(cos(a.r) * cosh(a.i), - sin(a.r) * sinh(a.i)); if(x.r == 0. && x.i == 0.) { fprintf(stderr, "Error : Divide by 0. in ctan()\n"); return tocomplex(0., 0.); } return cdiv(csin(a), x); } Complex csqrt(Complex a) { double t, z; z = pow(cabslt(a), 0.5); t = carg(a) / 2.; return tocomplex(z * cos(t), z * sin(t)); } Complex tocomplex(double x, double y) { Complex a; a.r = x; a.i = y; return a; } Complex conj(Complex a) { return tocomplex(a.r, - a.i); } Complex cfunc(Complex *a, int n, Complex x) { Complex *p, y; int i; p = a; y = *p++; for(i = 1; i <= n; i++) y = cadd(cmul(y, x), *p++); return y; } double cabslt(Complex a) { return sqrt(a.r * a.r + a.i * a.i); } double carg(Complex a) { if(cabslt(a) == 0.) return 0.; return atan2(a.i, a.r); } int ceq(Complex a, Complex b) { if(a.r == b.r && a.i == b.i) return 1; return 0; } int cne(Complex a, Complex b) { if(a.r != b.r || a.i != b.i) return 1; return 0; } |