diff options
author | Austin Seipp <austin@well-typed.com> | 2014-11-18 12:10:34 -0600 |
---|---|---|
committer | Austin Seipp <austin@well-typed.com> | 2014-11-18 12:12:35 -0600 |
commit | 1f6b1ab4b6d7203481bfaf374b014972f7756fb2 (patch) | |
tree | 4fa662bf53ed1de390310d687534308d53de15e3 /libraries | |
parent | 535644facb7fb35baacd3e4fd0c8181eadb24379 (diff) | |
download | haskell-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.hs | 16 |
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') |