Just to note, this is completely wrong and screwed up.  It should still calculate absolute value and argument of the return type, and calculate real and imaginary values based on `ab * cos(ar)`, `ab * sin(r)`.  I don't know what I was thinking, but I must have been trying to be clever and made an inappropriate assumption about what terms/calculations could be dropped.

To see the problem, try:
```D
auto rec2c = 2.0 ^^ c2;
auto rec2c2 = complex(2.0, 0.0) ^^ c2;
import std.stdio;
writeln(rec2c);
writeln(rec2c2);
```

The discrepancy is distressingly clear :-)