複素数(5)

atan2

前回のlogで、


log(-1+0i); // 0+3.14159i
log(-1-0.0i); // 0+3.14159i

となる。これは、atan2が次のようになるためである。


atan2(0.0, -1); // 3.14159
atan2(-0.0, -1); // -3.14159

sqrt

z = re とすると、
sqrt(z) = sqrt(r)eiθ/2 となる。
主値は実部が0以上となる。


import std.cstream;
import std.math;

void main(char[][] args) {
dout.writefln(sqrt(-1+0i)); // 6.12303e-17+1i
dout.writefln(sqrt(-1-0.0i)); // 6.12303e-17+-1i
}

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