shithub: MicroHs

Download patch

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
--