ref: ad81f6dcf0b4b97571f6afdc8190b14011246c90
parent: 5a6e20ca64a3a59cfef8d4bb9167e7c7532374e4
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Fri Nov 24 13:49:41 EST 2023
Better magnitude (modulos) functions.
--- a/lib/Data/Complex.hs
+++ b/lib/Data/Complex.hs
@@ -29,15 +29,15 @@
polar :: forall a . (RealFloat a) => Complex a -> (a,a)
polar z = (magnitude z, phase z)
-magnitude :: forall a . (RealFloat a) => Complex a -> a
-magnitude (x:+y) = sqrt (x*x + y*y)
-{-- scaleFloat k
- (sqrt (sqr (scaleFloat mk x) + sqr (scaleFloat mk y)))
- where k = max (exponent x) (exponent y)
- mk = negate k
- sqr z = z * z
--}
+magnitude :: forall a . (Ord a, Floating a) => Complex a -> a
+magnitude (x:+y) =
+ -- slightly contorted to avoid overflow
+ let ax = abs x
+ ay = abs y
+ mx = max ax ay
+ mn = min ax ay
+ r = mn / mx
+ in mx * sqrt(1 + r*r)
phase :: forall a . (RealFloat a) => Complex a -> a
-- XXX phase (0 :+ 0) = 0
--
⑨