Do we really need to get the `abs` of `lhs`, if the first thing we do is check it's sign? At the very least, I'd only calculate it in the second branch (if at all).

Unless my floating point-fu is too low, shouldn't this work just fine?

```D
        if (lhs >= 0)
        {
            return typeof(return)(lhs ^^ this.re, log(lhs) * this.im);
        }
        else
        {
            // theta = PI
            FPTemporary!R r = -lhs;
            FPTemporary!(CommonType!(T, R)) ab = r ^^ this.re * exp(-PI * this.im);
            FPTemporary!(CommonType!(T, R)) ar = PI * this.re + log(r) * this.im;
            return typeof(return)(ab * std.math.cos(ar), ab * std.math.sin(ar));
        }
```