複素数(7)

atan

 \tan{Z} = -i\frac{e^{iZ} - e^{-iZ}}{e^{iZ} + e^{-iZ}}

より、

 \mbox{atan}{z} = \frac{1}{2}i\log{\frac{1 + iz}{1 - iz}}

ただし、logが2π周期だから、
値は、実数がπ周期。

C99では、

http://docs.hp.com/ja/B2355-60104-06/catan.3M.html

値域は、[-π/2, π/2]。
素直に計算すればよい。


import std.cstream;
import std.math;

void main(char[][] args) {
dout.writefln(atan(1+1i)); // 1.01722+0.402359i
dout.writefln(atan(1-1i)); // 1.01722+-0.402359i
}

cdouble atan(cdouble z) {
return 0.5i * log( (1 - 1i * z) / (1 + 1i * z));
}

cdouble log(cdouble z) {
double x = z.re;
double y = z.im;
return std.math.log(x * x + y * y) / 2 + 1i * atan2(y, x);
}