summaryrefslogtreecommitdiff
path: root/libraries
diff options
context:
space:
mode:
authorAustin Seipp <austin@well-typed.com>2014-11-18 12:10:34 -0600
committerAustin Seipp <austin@well-typed.com>2014-11-18 12:12:35 -0600
commit1f6b1ab4b6d7203481bfaf374b014972f7756fb2 (patch)
tree4fa662bf53ed1de390310d687534308d53de15e3 /libraries
parent535644facb7fb35baacd3e4fd0c8181eadb24379 (diff)
downloadhaskell-1f6b1ab4b6d7203481bfaf374b014972f7756fb2.tar.gz
base: Fix (**) instance for Data.Complex (#8539)
Reviewed-by: Edward Kmett <ekmett@gmail.com> Authored-by: Yalas, Scott Turner Signed-off-by: Austin Seipp <austin@well-typed.com>
Diffstat (limited to 'libraries')
-rw-r--r--libraries/base/Data/Complex.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/libraries/base/Data/Complex.hs b/libraries/base/Data/Complex.hs
index 2baa60bd36..756ea67d84 100644
--- a/libraries/base/Data/Complex.hs
+++ b/libraries/base/Data/Complex.hs
@@ -138,6 +138,22 @@ instance (RealFloat a) => Floating (Complex a) where
where expx = exp x
log z = log (magnitude z) :+ phase z
+ x ** y = case (x,y) of
+ (_ , (0:+0)) -> 1 :+ 0
+ ((0:+0), (re:+_))
+ | re > 0 -> 0 :+ 0
+ | re < 0 -> inf :+ 0
+ | otherwise -> nan :+ nan
+ ((re:+im), y)
+ | (isInfinite re || isInfinite im) -> case y of
+ (exp_re:+_) | exp_re > 0 -> inf :+ 0
+ | exp_re < 0 -> 0 :+ 0
+ | otherwise -> nan :+ nan
+ (x, y) -> exp (log x * y)
+ where
+ inf = 1/0
+ nan = 0/0
+
sqrt (0:+0) = 0
sqrt z@(x:+y) = u :+ (if y < 0 then -v else v)
where (u,v) = if x < 0 then (v',u') else (u',v')