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 = reiθ とすると、
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));
}