(original) (raw)
{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE Trustworthy #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveTraversable #-}
module Data.Complex (
[Complex](Data.Complex.html#Complex)(([:+](Data.Complex.html#%3A%2B)))
, [realPart](Data.Complex.html#realPart)
, [imagPart](Data.Complex.html#imagPart)
, [mkPolar](Data.Complex.html#mkPolar)
, [cis](Data.Complex.html#cis)
, [polar](Data.Complex.html#polar)
, [magnitude](Data.Complex.html#magnitude)
, [phase](Data.Complex.html#phase)
, [conjugate](Data.Complex.html#conjugate)
) where
import GHC.Base (Applicative (..)) import GHC.Generics (Generic, Generic1) import GHC.Float (Floating(..)) import Data.Data (Data) import Foreign (Storable, castPtr, peek, poke, pokeElemOff, peekElemOff, sizeOf, alignment)
infix 6 :+
deriving ( Eq
, [Show](GHC.Show.html#Show)
, [Read](GHC.Read.html#Read)
, [Data](Data.Data.html#Data)
, [Generic](GHC.Generics.html#Generic)
, [Generic1](GHC.Generics.html#Generic1)
, [Functor](GHC.Base.html#Functor)
, [Foldable](Data.Foldable.html#Foldable)
, [Traversable](Data.Traversable.html#Traversable)
)
realPart :: Complex a -> a realPart (x :+ _) = x
imagPart :: Complex a -> a imagPart (_ :+ y) = y
{-# SPECIALISE conjugate :: Complex Double -> Complex Double #-} conjugate :: Num a => Complex a -> Complex a conjugate (x:+y) = x :+ (-y)
{-# SPECIALISE mkPolar :: Double -> Double -> Complex Double #-} mkPolar :: Floating a => a -> a -> Complex a mkPolar r theta = r * cos theta :+ r * sin theta
{-# SPECIALISE cis :: Double -> Complex Double #-} cis :: Floating a => a -> Complex a cis theta = cos theta :+ sin theta
{-# SPECIALISE polar :: Complex Double -> (Double,Double) #-} polar :: (RealFloat a) => Complex a -> (a,a) polar z = (magnitude z, phase z)
{-# SPECIALISE magnitude :: Complex Double -> Double #-} magnitude :: (RealFloat a) => Complex a -> a magnitude (x:+y) = scaleFloat k (sqrt (sqr (scaleFloat mk x) + sqr (scaleFloat mk y))) where k = max (exponent x) (exponent y) mk = - k sqr z = z * z
{-# SPECIALISE phase :: Complex Double -> Double #-}
phase :: (RealFloat a) => Complex a -> a
phase (0 :+ 0) = 0
phase (x:+y) = atan2 y x
instance (RealFloat a) => Num (Complex a) where {-# SPECIALISE instance Num (Complex Float) #-} {-# SPECIALISE instance Num (Complex Double) #-} (x:+y) + (x':+y') = (x+x') :+ (y+y') (x:+y) - (x':+y') = (x-x') :+ (y-y') (x:+y) * (x':+y') = (x*x'-y*y') :+ (x*y'+y*x') negate (x:+y) = negate x :+ negate y abs z = magnitude z :+ 0 signum (0:+0) = 0 signum z@(x:+y) = x/r :+ y/r where r = magnitude z fromInteger n = fromInteger n :+ 0
instance (RealFloat a) => Fractional (Complex a) where {-# SPECIALISE instance Fractional (Complex Float) #-} {-# SPECIALISE instance Fractional (Complex Double) #-} (x:+y) / (x':+y') = (x*x''+y*y'') / d :+ (y*x''-x*y'') / d where x'' = scaleFloat k x' y'' = scaleFloat k y' k = - max (exponent x') (exponent y') d = x'*x'' + y'*y''
[fromRational](GHC.Real.html#fromRational) [a](#local-6989586621679483050) = [fromRational](GHC.Real.html#fromRational) [a](#local-6989586621679483050) [:+](Data.Complex.html#%3A%2B) 0
instance (RealFloat a) => Floating (Complex a) where {-# SPECIALISE instance Floating (Complex Float) #-} {-# SPECIALISE instance Floating (Complex Double) #-} pi = pi :+ 0 exp (x:+y) = expx * cos y :+ expx * sin y where expx = exp x log z = log (magnitude z) :+ phase z
[x](#local-6989586621679482978) [**](GHC.Float.html#%2A%2A) [y](#local-6989586621679482979) = case ([x](#local-6989586621679482978),[y](#local-6989586621679482979)) of
(_ , (0[:+](Data.Complex.html#%3A%2B)0)) -> 1 [:+](Data.Complex.html#%3A%2B) 0
((0[:+](Data.Complex.html#%3A%2B)0), ([exp_re](#local-6989586621679482982)[:+](Data.Complex.html#%3A%2B)_)) -> case compare [exp_re](#local-6989586621679482982) 0 of
GT -> 0 [:+](Data.Complex.html#%3A%2B) 0
LT -> [inf](#local-6989586621679482980) [:+](Data.Complex.html#%3A%2B) 0
EQ -> [nan](#local-6989586621679482981) [:+](Data.Complex.html#%3A%2B) [nan](#local-6989586621679482981)
(([re](#local-6989586621679482983)[:+](Data.Complex.html#%3A%2B)[im](#local-6989586621679482984)), ([exp_re](#local-6989586621679482985)[:+](Data.Complex.html#%3A%2B)_))
| ([isInfinite](GHC.Float.html#isInfinite) [re](#local-6989586621679482983) || [isInfinite](GHC.Float.html#isInfinite) [im](#local-6989586621679482984)) -> case compare [exp_re](#local-6989586621679482985) 0 of
GT -> [inf](#local-6989586621679482980) [:+](Data.Complex.html#%3A%2B) 0
LT -> 0 [:+](Data.Complex.html#%3A%2B) 0
EQ -> [nan](#local-6989586621679482981) [:+](Data.Complex.html#%3A%2B) [nan](#local-6989586621679482981)
| [otherwise](GHC.Base.html#otherwise) -> [exp](GHC.Float.html#exp) ([log](GHC.Float.html#log) [x](#local-6989586621679482978) [*](GHC.Num.html#%2A) [y](#local-6989586621679482979))
where
[inf](#local-6989586621679482980) = 1[/](GHC.Real.html#%2F)0
[nan](#local-6989586621679482981) = 0[/](GHC.Real.html#%2F)0
[sqrt](GHC.Float.html#sqrt) (0[:+](Data.Complex.html#%3A%2B)0) = 0
sqrt [z](#local-6989586621679482986)@([x](#local-6989586621679482987)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679482988)) = [u](#local-6989586621679482989) [:+](Data.Complex.html#%3A%2B) (if [y](#local-6989586621679482988) < 0 then -[v](#local-6989586621679482990) else [v](#local-6989586621679482990))
where ([u](#local-6989586621679482989),[v](#local-6989586621679482990)) = if [x](#local-6989586621679482987) < 0 then ([v'](#local-6989586621679482991),[u'](#local-6989586621679482992)) else ([u'](#local-6989586621679482992),[v'](#local-6989586621679482991))
[v'](#local-6989586621679482991) = [abs](GHC.Num.html#abs) [y](#local-6989586621679482988) [/](GHC.Real.html#%2F) ([u'](#local-6989586621679482992)[*](GHC.Num.html#%2A)2)
[u'](#local-6989586621679482992) = [sqrt](GHC.Float.html#sqrt) (([magnitude](Data.Complex.html#magnitude) [z](#local-6989586621679482986) [+](GHC.Num.html#%2B) [abs](GHC.Num.html#abs) [x](#local-6989586621679482987)) [/](GHC.Real.html#%2F) 2)
[sin](GHC.Float.html#sin) ([x](#local-6989586621679482993)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679482994)) = [sin](GHC.Float.html#sin) [x](#local-6989586621679482993) [*](GHC.Num.html#%2A) [cosh](GHC.Float.html#cosh) [y](#local-6989586621679482994) [:+](Data.Complex.html#%3A%2B) [cos](GHC.Float.html#cos) [x](#local-6989586621679482993) [*](GHC.Num.html#%2A) [sinh](GHC.Float.html#sinh) [y](#local-6989586621679482994)
[cos](GHC.Float.html#cos) ([x](#local-6989586621679482995)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679482996)) = [cos](GHC.Float.html#cos) [x](#local-6989586621679482995) [*](GHC.Num.html#%2A) [cosh](GHC.Float.html#cosh) [y](#local-6989586621679482996) [:+](Data.Complex.html#%3A%2B) (- [sin](GHC.Float.html#sin) [x](#local-6989586621679482995) [*](GHC.Num.html#%2A) [sinh](GHC.Float.html#sinh) [y](#local-6989586621679482996))
[tan](GHC.Float.html#tan) ([x](#local-6989586621679482997)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679482998)) = ([sinx](#local-6989586621679482999)[*](GHC.Num.html#%2A)[coshy](#local-6989586621679483002)[:+](Data.Complex.html#%3A%2B)[cosx](#local-6989586621679483000)[*](GHC.Num.html#%2A)[sinhy](#local-6989586621679483001))[/](GHC.Real.html#%2F)([cosx](#local-6989586621679483000)[*](GHC.Num.html#%2A)[coshy](#local-6989586621679483002)[:+](Data.Complex.html#%3A%2B)(-[sinx](#local-6989586621679482999)[*](GHC.Num.html#%2A)[sinhy](#local-6989586621679483001)))
where [sinx](#local-6989586621679482999) = [sin](GHC.Float.html#sin) [x](#local-6989586621679482997)
[cosx](#local-6989586621679483000) = [cos](GHC.Float.html#cos) [x](#local-6989586621679482997)
[sinhy](#local-6989586621679483001) = [sinh](GHC.Float.html#sinh) [y](#local-6989586621679482998)
[coshy](#local-6989586621679483002) = [cosh](GHC.Float.html#cosh) [y](#local-6989586621679482998)
[sinh](GHC.Float.html#sinh) ([x](#local-6989586621679483003)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679483004)) = [cos](GHC.Float.html#cos) [y](#local-6989586621679483004) [*](GHC.Num.html#%2A) [sinh](GHC.Float.html#sinh) [x](#local-6989586621679483003) [:+](Data.Complex.html#%3A%2B) [sin](GHC.Float.html#sin) [y](#local-6989586621679483004) [*](GHC.Num.html#%2A) [cosh](GHC.Float.html#cosh) [x](#local-6989586621679483003)
[cosh](GHC.Float.html#cosh) ([x](#local-6989586621679483005)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679483006)) = [cos](GHC.Float.html#cos) [y](#local-6989586621679483006) [*](GHC.Num.html#%2A) [cosh](GHC.Float.html#cosh) [x](#local-6989586621679483005) [:+](Data.Complex.html#%3A%2B) [sin](GHC.Float.html#sin) [y](#local-6989586621679483006) [*](GHC.Num.html#%2A) [sinh](GHC.Float.html#sinh) [x](#local-6989586621679483005)
[tanh](GHC.Float.html#tanh) ([x](#local-6989586621679483007)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679483008)) = ([cosy](#local-6989586621679483010)[*](GHC.Num.html#%2A)[sinhx](#local-6989586621679483011)[:+](Data.Complex.html#%3A%2B)[siny](#local-6989586621679483009)[*](GHC.Num.html#%2A)[coshx](#local-6989586621679483012))[/](GHC.Real.html#%2F)([cosy](#local-6989586621679483010)[*](GHC.Num.html#%2A)[coshx](#local-6989586621679483012)[:+](Data.Complex.html#%3A%2B)[siny](#local-6989586621679483009)[*](GHC.Num.html#%2A)[sinhx](#local-6989586621679483011))
where [siny](#local-6989586621679483009) = [sin](GHC.Float.html#sin) [y](#local-6989586621679483008)
[cosy](#local-6989586621679483010) = [cos](GHC.Float.html#cos) [y](#local-6989586621679483008)
[sinhx](#local-6989586621679483011) = [sinh](GHC.Float.html#sinh) [x](#local-6989586621679483007)
[coshx](#local-6989586621679483012) = [cosh](GHC.Float.html#cosh) [x](#local-6989586621679483007)
[asin](GHC.Float.html#asin) [z](#local-6989586621679483013)@([x](#local-6989586621679483014)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679483015)) = [y'](#local-6989586621679483017)[:+](Data.Complex.html#%3A%2B)(-[x'](#local-6989586621679483016))
where ([x'](#local-6989586621679483016)[:+](Data.Complex.html#%3A%2B)[y'](#local-6989586621679483017)) = [log](GHC.Float.html#log) (((-[y](#local-6989586621679483015))[:+](Data.Complex.html#%3A%2B)[x](#local-6989586621679483014)) [+](GHC.Num.html#%2B) [sqrt](GHC.Float.html#sqrt) (1 - [z](#local-6989586621679483013)[*](GHC.Num.html#%2A)[z](#local-6989586621679483013)))
[acos](GHC.Float.html#acos) [z](#local-6989586621679483018) = [y''](#local-6989586621679483020)[:+](Data.Complex.html#%3A%2B)(-[x''](#local-6989586621679483019))
where ([x''](#local-6989586621679483019)[:+](Data.Complex.html#%3A%2B)[y''](#local-6989586621679483020)) = [log](GHC.Float.html#log) ([z](#local-6989586621679483018) [+](GHC.Num.html#%2B) ((-[y'](#local-6989586621679483022))[:+](Data.Complex.html#%3A%2B)[x'](#local-6989586621679483021)))
([x'](#local-6989586621679483021)[:+](Data.Complex.html#%3A%2B)[y'](#local-6989586621679483022)) = [sqrt](GHC.Float.html#sqrt) (1 - [z](#local-6989586621679483018)[*](GHC.Num.html#%2A)[z](#local-6989586621679483018))
[atan](GHC.Float.html#atan) [z](#local-6989586621679483023)@([x](#local-6989586621679483024)[:+](Data.Complex.html#%3A%2B)[y](#local-6989586621679483025)) = [y'](#local-6989586621679483027)[:+](Data.Complex.html#%3A%2B)(-[x'](#local-6989586621679483026))
where ([x'](#local-6989586621679483026)[:+](Data.Complex.html#%3A%2B)[y'](#local-6989586621679483027)) = [log](GHC.Float.html#log) (((1-[y](#local-6989586621679483025))[:+](Data.Complex.html#%3A%2B)[x](#local-6989586621679483024)) [/](GHC.Real.html#%2F) [sqrt](GHC.Float.html#sqrt) (1[+](GHC.Num.html#%2B)[z](#local-6989586621679483023)[*](GHC.Num.html#%2A)[z](#local-6989586621679483023)))
[asinh](GHC.Float.html#asinh) [z](#local-6989586621679483028) = [log](GHC.Float.html#log) ([z](#local-6989586621679483028) [+](GHC.Num.html#%2B) [sqrt](GHC.Float.html#sqrt) (1[+](GHC.Num.html#%2B)[z](#local-6989586621679483028)[*](GHC.Num.html#%2A)[z](#local-6989586621679483028)))
[acosh](GHC.Float.html#acosh) [z](#local-6989586621679483029) = [log](GHC.Float.html#log) ([z](#local-6989586621679483029) [+](GHC.Num.html#%2B) ([sqrt](GHC.Float.html#sqrt) [$](GHC.Base.html#%24) [z](#local-6989586621679483029)[+](GHC.Num.html#%2B)1) [*](GHC.Num.html#%2A) ([sqrt](GHC.Float.html#sqrt) [$](GHC.Base.html#%24) [z](#local-6989586621679483029)-1))
[atanh](GHC.Float.html#atanh) [z](#local-6989586621679483030) = 0.5 [*](GHC.Num.html#%2A) [log](GHC.Float.html#log) ((1.0[+](GHC.Num.html#%2B)[z](#local-6989586621679483030)) [/](GHC.Real.html#%2F) (1.0-[z](#local-6989586621679483030)))
[log1p](GHC.Float.html#log1p) [x](#local-6989586621679483031)@([a](#local-6989586621679483032) [:+](Data.Complex.html#%3A%2B) [b](#local-6989586621679483033))
| [abs](GHC.Num.html#abs) [a](#local-6989586621679483032) < 0.5 && [abs](GHC.Num.html#abs) [b](#local-6989586621679483033) < 0.5
, [u](#local-6989586621679483034) <- 2[*](GHC.Num.html#%2A)[a](#local-6989586621679483032) [+](GHC.Num.html#%2B) [a](#local-6989586621679483032)[*](GHC.Num.html#%2A)[a](#local-6989586621679483032) [+](GHC.Num.html#%2B) [b](#local-6989586621679483033)[*](GHC.Num.html#%2A)[b](#local-6989586621679483033) = [log1p](GHC.Float.html#log1p) ([u](#local-6989586621679483034)[/](GHC.Real.html#%2F)(1 [+](GHC.Num.html#%2B) [sqrt](GHC.Float.html#sqrt)([u](#local-6989586621679483034)[+](GHC.Num.html#%2B)1))) [:+](Data.Complex.html#%3A%2B) [atan2](GHC.Float.html#atan2) (1 [+](GHC.Num.html#%2B) [a](#local-6989586621679483032)) [b](#local-6989586621679483033)
| [otherwise](GHC.Base.html#otherwise) = [log](GHC.Float.html#log) (1 [+](GHC.Num.html#%2B) [x](#local-6989586621679483031))
{-# INLINE log1p #-}
[expm1](GHC.Float.html#expm1) [x](#local-6989586621679483035)@([a](#local-6989586621679483036) [:+](Data.Complex.html#%3A%2B) [b](#local-6989586621679483037))
| [a](#local-6989586621679483036)[*](GHC.Num.html#%2A)[a](#local-6989586621679483036) [+](GHC.Num.html#%2B) [b](#local-6989586621679483037)[*](GHC.Num.html#%2A)[b](#local-6989586621679483037) < 1
, [u](#local-6989586621679483038) <- [expm1](GHC.Float.html#expm1) [a](#local-6989586621679483036)
, [v](#local-6989586621679483039) <- [sin](GHC.Float.html#sin) ([b](#local-6989586621679483037)[/](GHC.Real.html#%2F)2)
, [w](#local-6989586621679483040) <- -2[*](GHC.Num.html#%2A)[v](#local-6989586621679483039)[*](GHC.Num.html#%2A)[v](#local-6989586621679483039) = ([u](#local-6989586621679483038)[*](GHC.Num.html#%2A)[w](#local-6989586621679483040) [+](GHC.Num.html#%2B) [u](#local-6989586621679483038) [+](GHC.Num.html#%2B) [w](#local-6989586621679483040)) [:+](Data.Complex.html#%3A%2B) ([u](#local-6989586621679483038)[+](GHC.Num.html#%2B)1)[*](GHC.Num.html#%2A)[sin](GHC.Float.html#sin) [b](#local-6989586621679483037)
| [otherwise](GHC.Base.html#otherwise) = [exp](GHC.Float.html#exp) [x](#local-6989586621679483035) - 1
{-# INLINE expm1 #-}
instance Storable a => Storable (Complex a) where sizeOf a = 2 * sizeOf (realPart a) alignment a = alignment (realPart a) peek p = do q <- return $ castPtr p r <- peek q i <- peekElemOff q 1 return (r :+ i) poke p (r :+ i) = do q <-return $ (castPtr p) poke q r pokeElemOff q 1 i
instance Applicative Complex where pure a = a :+ a f :+ g <*> a :+ b = f a :+ g b liftA2 f (x :+ y) (a :+ b) = f x a :+ f y b
instance Monad Complex where a :+ b >>= f = realPart (f a) :+ imagPart (f b)
{-# RULES
"realToFrac/a->Complex Double" realToFrac = \x -> realToFrac x :+ (0 :: Double)
"realToFrac/a->Complex Float" realToFrac = \x -> realToFrac x :+ (0 :: Float)
#-}