diff --git a/typed-racket-lib/typed-racket/optimizer/float-complex.rkt b/typed-racket-lib/typed-racket/optimizer/float-complex.rkt index 529aa655..88f9835c 100644 --- a/typed-racket-lib/typed-racket/optimizer/float-complex.rkt +++ b/typed-racket-lib/typed-racket/optimizer/float-complex.rkt @@ -570,11 +570,18 @@ #`(let*-values (c.bindings ...) ;; reuses the algorithm used by the Racket runtime (let*-values ([(r) (unsafe-flabs c.real-binding)] - [(i) (unsafe-flabs c.imag-binding)] - [(q) (unsafe-fl/ r i)]) - (unsafe-fl* i - (unsafe-flsqrt (unsafe-fl+ 1.0 - (unsafe-fl* q q))))))]))) + [(i) (unsafe-flabs c.imag-binding)]) + (if (zero? i) + r + (if (unsafe-fl< i r) + (let-values ([(q) (unsafe-fl/ i r)]) + (unsafe-fl* r + (unsafe-flsqrt (unsafe-fl+ 1.0 + (unsafe-fl* q q))))) + (let-values ([(q) (unsafe-fl/ r i)]) + (unsafe-fl* i + (unsafe-flsqrt (unsafe-fl+ 1.0 + (unsafe-fl* q q)))))))))]))) (pattern (#%plain-app op:float-complex-op e:expr ...)