base: Fix (**) instance for Data.Complex (#8539)
authorAustin Seipp <austin@well-typed.com>
Tue, 18 Nov 2014 18:10:34 +0000 (12:10 -0600)
committerAustin Seipp <austin@well-typed.com>
Tue, 18 Nov 2014 18:12:35 +0000 (12:12 -0600)
Reviewed-by: Edward Kmett <ekmett@gmail.com>
Authored-by: Yalas, Scott Turner
Signed-off-by: Austin Seipp <austin@well-typed.com>
libraries/base/Data/Complex.hs

index 2baa60b..756ea67 100644 (file)
@@ -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')