module Numeric.VariablePrecision.Complex
( VComplex(..)
, (.+)
, fromComplex
, withComplex
, realPart
, imagPart
, conjugate
, magnitude
, magnitude2
, phase
, polar
, cis
, mkPolar
, module Numeric.VariablePrecision.Float
) where
import Data.Data (Data())
import Data.Typeable (Typeable())
import qualified Data.Complex as X
import Numeric.VariablePrecision.Float
newtype VComplex p = C{ toComplex :: X.Complex (VFloat p) }
deriving (Eq, Num, Fractional, Floating, Data, Typeable)
(.+) :: NaturalNumber p => VFloat p -> VFloat p -> VComplex p
x .+ y = C (x X.:+ y)
infix 6 .+
instance HasPrecision VComplex
instance VariablePrecision VComplex where
adjustPrecision (C (x X.:+ y)) = C (adjustPrecision x X.:+ adjustPrecision y)
fromComplex :: X.Complex (VFloat p) -> VComplex p
fromComplex = C
withComplex :: (X.Complex (VFloat p) -> X.Complex (VFloat q)) -> (VComplex p -> VComplex q)
withComplex f = fromComplex . f . toComplex
instance NaturalNumber p => Show (VComplex p) where
showsPrec p (C c) = showsPrec p c
instance NaturalNumber p => Read (VComplex p) where
readsPrec p = map (first C) . readsPrec p
where first f (a, b) = (f a, b)
cis :: NaturalNumber p => VFloat p -> VComplex p
cis = fromComplex . X.cis
mkPolar :: NaturalNumber p => VFloat p -> VFloat p -> VComplex p
mkPolar r t = fromComplex (X.mkPolar r t)
conjugate :: NaturalNumber p => VComplex p -> VComplex p
conjugate = withComplex X.conjugate
imagPart :: NaturalNumber p => VComplex p -> VFloat p
imagPart = X.imagPart . toComplex
realPart :: NaturalNumber p => VComplex p -> VFloat p
realPart = X.realPart . toComplex
phase :: NaturalNumber p => VComplex p -> VFloat p
phase = X.phase . toComplex
polar :: NaturalNumber p => VComplex p -> (VFloat p, VFloat p)
polar = X.polar . toComplex
magnitude :: NaturalNumber p => VComplex p -> VFloat p
magnitude = X.magnitude . toComplex
magnitude2 :: NaturalNumber p => VComplex p -> VFloat p
magnitude2 = magnitude2' . toComplex
magnitude2' :: RealFloat r => X.Complex r -> r
magnitude2' (x X.:+ y) = x * x + y * y