{-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE Trustworthy #-}{-# LANGUAGE StandaloneDeriving #-}{-# LANGUAGE DeriveGeneric #-}{-# LANGUAGE DeriveTraversable #-}------------------------------------------------------------------------------- |-- Module : Data.Complex-- Copyright : (c) The University of Glasgow 2001-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Stability : provisional-- Portability : portable---- Complex numbers.-------------------------------------------------------------------------------moduleData.Complex(-- * Rectangular formComplex ((:+) ),realPart ,imagPart -- * Polar form,mkPolar ,cis ,polar ,magnitude ,phase -- * Conjugate,conjugate )whereimportGHC.Base (Applicative (..))importGHC.Generics (Generic ,Generic1 )importGHC.Float (Floating (..))importData.Data (Data )importForeign (Storable ,castPtr ,peek ,poke ,pokeElemOff ,peekElemOff ,sizeOf ,alignment )infix6:+ -- ------------------------------------------------------------------------------- The Complex type-- | Complex numbers are an algebraic type.---- For a complex number @z@, @'abs' z@ is a number with the magnitude of @z@,-- but oriented in the positive real direction, whereas @'signum' z@-- has the phase of @z@, but unit magnitude.---- The 'Foldable' and 'Traversable' instances traverse the real part first.---- Note that `Complex`'s instances inherit the deficiencies from the type-- parameter's. For example, @Complex Float@'s 'Ord' instance has similar-- problems to `Float`'s.dataComplex a =!a :+ !a -- ^ forms a complex number from its real and imaginary-- rectangular components.deriving(Eq-- ^ @since 2.01,Show -- ^ @since 2.01,Read -- ^ @since 2.01,Data -- ^ @since 2.01,Generic -- ^ @since 4.9.0.0,Generic1 -- ^ @since 4.9.0.0,Functor -- ^ @since 4.9.0.0,Foldable -- ^ @since 4.9.0.0,Traversable -- ^ @since 4.9.0.0)-- ------------------------------------------------------------------------------- Functions over Complex-- | Extracts the real part of a complex number.realPart ::Complex a ->a realPart :: Complex a -> a
realPart (x :: a
x :+ _)=a
x -- | Extracts the imaginary part of a complex number.imagPart ::Complex a ->a imagPart :: Complex a -> a
imagPart (_:+ y :: a
y )=a
y -- | The conjugate of a complex number.{-# SPECIALISEconjugate ::Complex Double->Complex Double#-}conjugate ::Num a =>Complex a ->Complex a conjugate :: Complex a -> Complex a
conjugate (x :: a
x :+ y :: a
y )=a
x a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a
y )-- | Form a complex number from polar components of magnitude and phase.{-# SPECIALISEmkPolar ::Double->Double->Complex Double#-}mkPolar ::Floating a =>a ->a ->Complex a mkPolar :: a -> a -> Complex a
mkPolar r :: a
r theta :: a
theta =a
r a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cos a
theta a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
r a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sin a
theta -- | @'cis' t@ is a complex value with magnitude @1@-- and phase @t@ (modulo @2*'pi'@).{-# SPECIALISEcis ::Double->Complex Double#-}cis ::Floating a =>a ->Complex a cis :: a -> Complex a
cis theta :: a
theta =a -> a
forall a. Floating a => a -> a
cos a
theta a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a
forall a. Floating a => a -> a
sin a
theta -- | The function 'polar' takes a complex number and-- returns a (magnitude, phase) pair in canonical form:-- the magnitude is nonnegative, and the phase in the range @(-'pi', 'pi']@;-- if the magnitude is zero, then so is the phase.{-# SPECIALISEpolar ::Complex Double->(Double,Double)#-}polar ::(RealFloat a )=>Complex a ->(a ,a )polar :: Complex a -> (a, a)
polar z :: Complex a
z =(Complex a -> a
forall a. RealFloat a => Complex a -> a
magnitude Complex a
z ,Complex a -> a
forall a. RealFloat a => Complex a -> a
phase Complex a
z )-- | The nonnegative magnitude of a complex number.{-# SPECIALISEmagnitude ::Complex Double->Double#-}magnitude ::(RealFloat a )=>Complex a ->a magnitude :: Complex a -> a
magnitude (x :: a
x :+ y :: a
y )=Int -> a -> a
forall a. RealFloat a => Int -> a -> a
scaleFloat Int
k (a -> a
forall a. Floating a => a -> a
sqrt (a -> a
forall a. Num a => a -> a
sqr (Int -> a -> a
forall a. RealFloat a => Int -> a -> a
scaleFloat Int
mk a
x )a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
forall a. Num a => a -> a
sqr (Int -> a -> a
forall a. RealFloat a => Int -> a -> a
scaleFloat Int
mk a
y )))wherek :: Int
k =Int -> Int -> Int
forall a. Ord a => a -> a -> a
max(a -> Int
forall a. RealFloat a => a -> Int
exponent a
x )(a -> Int
forall a. RealFloat a => a -> Int
exponent a
y )mk :: Int
mk =-Int
k sqr :: a -> a
sqr z :: a
z =a
z a -> a -> a
forall a. Num a => a -> a -> a
* a
z -- | The phase of a complex number, in the range @(-'pi', 'pi']@.-- If the magnitude is zero, then so is the phase.{-# SPECIALISEphase ::Complex Double->Double#-}phase ::(RealFloat a )=>Complex a ->a phase :: Complex a -> a
phase (0:+ 0)=0-- SLPJ July 97 from John Petersonphase (x :: a
x :+ y :: a
y )=a -> a -> a
forall a. RealFloat a => a -> a -> a
atan2 a
y a
x -- ------------------------------------------------------------------------------- Instances of Complex-- | @since 2.01instance(RealFloat a )=>Num (Complex a )where{-# SPECIALISEinstanceNum (Complex Float)#-}{-# SPECIALISEinstanceNum (Complex Double)#-}(x :: a
x :+ y :: a
y )+ :: Complex a -> Complex a -> Complex a
+ (x' :: a
x' :+ y' :: a
y' )=(a
x a -> a -> a
forall a. Num a => a -> a -> a
+ a
x' )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (a
y a -> a -> a
forall a. Num a => a -> a -> a
+ a
y' )(x :: a
x :+ y :: a
y )- :: Complex a -> Complex a -> Complex a
- (x' :: a
x' :+ y' :: a
y' )=(a
x a -> a -> a
forall a. Num a => a -> a -> a
- a
x' )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (a
y a -> a -> a
forall a. Num a => a -> a -> a
- a
y' )(x :: a
x :+ y :: a
y )* :: Complex a -> Complex a -> Complex a
* (x' :: a
x' :+ y' :: a
y' )=(a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x' a -> a -> a
forall a. Num a => a -> a -> a
- a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y' )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
y' a -> a -> a
forall a. Num a => a -> a -> a
+ a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
x' )negate :: Complex a -> Complex a
negate (x :: a
x :+ y :: a
y )=a -> a
forall a. Num a => a -> a
negate a
x a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a
forall a. Num a => a -> a
negate a
y abs :: Complex a -> Complex a
abs z :: Complex a
z =Complex a -> a
forall a. RealFloat a => Complex a -> a
magnitude Complex a
z a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0signum :: Complex a -> Complex a
signum (0:+ 0)=0signum z :: Complex a
z @(x :: a
x :+ y :: a
y )=a
x a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
r a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
y a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
r wherer :: a
r =Complex a -> a
forall a. RealFloat a => Complex a -> a
magnitude Complex a
z fromInteger :: Integer -> Complex a
fromInteger n :: Integer
n =Integer -> a
forall a. Num a => Integer -> a
fromInteger Integer
n a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0-- | @since 2.01instance(RealFloat a )=>Fractional (Complex a )where{-# SPECIALISEinstanceFractional (Complex Float)#-}{-# SPECIALISEinstanceFractional (Complex Double)#-}(x :: a
x :+ y :: a
y )/ :: Complex a -> Complex a -> Complex a
/ (x' :: a
x' :+ y' :: a
y' )=(a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
x'' a -> a -> a
forall a. Num a => a -> a -> a
+ a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
y'' )a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
d a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (a
y a -> a -> a
forall a. Num a => a -> a -> a
* a
x'' a -> a -> a
forall a. Num a => a -> a -> a
- a
x a -> a -> a
forall a. Num a => a -> a -> a
* a
y'' )a -> a -> a
forall a. Fractional a => a -> a -> a
/ a
d wherex'' :: a
x'' =Int -> a -> a
forall a. RealFloat a => Int -> a -> a
scaleFloat Int
k a
x' y'' :: a
y'' =Int -> a -> a
forall a. RealFloat a => Int -> a -> a
scaleFloat Int
k a
y' k :: Int
k =-Int -> Int -> Int
forall a. Ord a => a -> a -> a
max(a -> Int
forall a. RealFloat a => a -> Int
exponent a
x' )(a -> Int
forall a. RealFloat a => a -> Int
exponent a
y' )d :: a
d =a
x' a -> a -> a
forall a. Num a => a -> a -> a
* a
x'' a -> a -> a
forall a. Num a => a -> a -> a
+ a
y' a -> a -> a
forall a. Num a => a -> a -> a
* a
y'' fromRational :: Rational -> Complex a
fromRational a :: Rational
a =Rational -> a
forall a. Fractional a => Rational -> a
fromRational Rational
a a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0-- | @since 2.01instance(RealFloat a )=>Floating (Complex a )where{-# SPECIALISEinstanceFloating (Complex Float)#-}{-# SPECIALISEinstanceFloating (Complex Double)#-}pi :: Complex a
pi =a
forall a. Floating a => a
pi a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0exp :: Complex a -> Complex a
exp (x :: a
x :+ y :: a
y )=a
expx a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cos a
y a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
expx a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sin a
y whereexpx :: a
expx =a -> a
forall a. Floating a => a -> a
exp a
x log :: Complex a -> Complex a
log z :: Complex a
z =a -> a
forall a. Floating a => a -> a
log (Complex a -> a
forall a. RealFloat a => Complex a -> a
magnitude Complex a
z )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ Complex a -> a
forall a. RealFloat a => Complex a -> a
phase Complex a
z x :: Complex a
x ** :: Complex a -> Complex a -> Complex a
** y :: Complex a
y =case(Complex a
x ,Complex a
y )of(_,(0:+ 0))->1a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0((0:+ 0),(exp_re :: a
exp_re :+ _))->casea -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
comparea
exp_re 0ofGT->0a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0LT->a
inf a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0EQ->a
nan a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
nan ((re :: a
re :+ im :: a
im ),(exp_re :: a
exp_re :+ _))|(a -> Bool
forall a. RealFloat a => a -> Bool
isInfinite a
re Bool -> Bool -> Bool
||a -> Bool
forall a. RealFloat a => a -> Bool
isInfinite a
im )->casea -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
comparea
exp_re 0ofGT->a
inf a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0LT->0a -> a -> Complex a
forall a. a -> a -> Complex a
:+ 0EQ->a
nan a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
nan |Bool
otherwise ->Complex a -> Complex a
forall a. Floating a => a -> a
exp (Complex a -> Complex a
forall a. Floating a => a -> a
log Complex a
x Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a
y )whereinf :: a
inf =1a -> a -> a
forall a. Fractional a => a -> a -> a
/ 0nan :: a
nan =0a -> a -> a
forall a. Fractional a => a -> a -> a
/ 0sqrt :: Complex a -> Complex a
sqrt (0:+ 0)=0sqrt z :: Complex a
z @(x :: a
x :+ y :: a
y )=a
u a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (ifa
y a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<0then-a
v elsea
v )where(u :: a
u ,v :: a
v )=ifa
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<0then(a
v' ,a
u' )else(a
u' ,a
v' )v' :: a
v' =a -> a
forall a. Num a => a -> a
abs a
y a -> a -> a
forall a. Fractional a => a -> a -> a
/ (a
u' a -> a -> a
forall a. Num a => a -> a -> a
* 2)u' :: a
u' =a -> a
forall a. Floating a => a -> a
sqrt ((Complex a -> a
forall a. RealFloat a => Complex a -> a
magnitude Complex a
z a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
forall a. Num a => a -> a
abs a
x )a -> a -> a
forall a. Fractional a => a -> a -> a
/ 2)sin :: Complex a -> Complex a
sin (x :: a
x :+ y :: a
y )=a -> a
forall a. Floating a => a -> a
sin a
x a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cosh a
y a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a
forall a. Floating a => a -> a
cos a
x a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sinh a
y cos :: Complex a -> Complex a
cos (x :: a
x :+ y :: a
y )=a -> a
forall a. Floating a => a -> a
cos a
x a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cosh a
y a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a -> a
forall a. Floating a => a -> a
sin a
x a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sinh a
y )tan :: Complex a -> Complex a
tan (x :: a
x :+ y :: a
y )=(a
sinx a -> a -> a
forall a. Num a => a -> a -> a
* a
coshy a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
cosx a -> a -> a
forall a. Num a => a -> a -> a
* a
sinhy )Complex a -> Complex a -> Complex a
forall a. Fractional a => a -> a -> a
/ (a
cosx a -> a -> a
forall a. Num a => a -> a -> a
* a
coshy a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a
sinx a -> a -> a
forall a. Num a => a -> a -> a
* a
sinhy ))wheresinx :: a
sinx =a -> a
forall a. Floating a => a -> a
sin a
x cosx :: a
cosx =a -> a
forall a. Floating a => a -> a
cos a
x sinhy :: a
sinhy =a -> a
forall a. Floating a => a -> a
sinh a
y coshy :: a
coshy =a -> a
forall a. Floating a => a -> a
cosh a
y sinh :: Complex a -> Complex a
sinh (x :: a
x :+ y :: a
y )=a -> a
forall a. Floating a => a -> a
cos a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sinh a
x a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a
forall a. Floating a => a -> a
sin a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cosh a
x cosh :: Complex a -> Complex a
cosh (x :: a
x :+ y :: a
y )=a -> a
forall a. Floating a => a -> a
cos a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
cosh a
x a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a
forall a. Floating a => a -> a
sin a
y a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sinh a
x tanh :: Complex a -> Complex a
tanh (x :: a
x :+ y :: a
y )=(a
cosy a -> a -> a
forall a. Num a => a -> a -> a
* a
sinhx a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
siny a -> a -> a
forall a. Num a => a -> a -> a
* a
coshx )Complex a -> Complex a -> Complex a
forall a. Fractional a => a -> a -> a
/ (a
cosy a -> a -> a
forall a. Num a => a -> a -> a
* a
coshx a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
siny a -> a -> a
forall a. Num a => a -> a -> a
* a
sinhx )wheresiny :: a
siny =a -> a
forall a. Floating a => a -> a
sin a
y cosy :: a
cosy =a -> a
forall a. Floating a => a -> a
cos a
y sinhx :: a
sinhx =a -> a
forall a. Floating a => a -> a
sinh a
x coshx :: a
coshx =a -> a
forall a. Floating a => a -> a
cosh a
x asin :: Complex a -> Complex a
asin z :: Complex a
z @(x :: a
x :+ y :: a
y )=a
y' a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a
x' )where(x' :: a
x' :+ y' :: a
y' )=Complex a -> Complex a
forall a. Floating a => a -> a
log (((-a
y )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
x )Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (1Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
- Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a
z ))acos :: Complex a -> Complex a
acos z :: Complex a
z =a
y'' a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a
x'' )where(x'' :: a
x'' :+ y'' :: a
y'' )=Complex a -> Complex a
forall a. Floating a => a -> a
log (Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ ((-a
y' )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
x' ))(x' :: a
x' :+ y' :: a
y' )=Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (1Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
- Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a
z )atan :: Complex a -> Complex a
atan z :: Complex a
z @(x :: a
x :+ y :: a
y )=a
y' a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (-a
x' )where(x' :: a
x' :+ y' :: a
y' )=Complex a -> Complex a
forall a. Floating a => a -> a
log (((1a -> a -> a
forall a. Num a => a -> a -> a
- a
y )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
x )Complex a -> Complex a -> Complex a
forall a. Fractional a => a -> a -> a
/ Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (1Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a
z ))asinh :: Complex a -> Complex a
asinh z :: Complex a
z =Complex a -> Complex a
forall a. Floating a => a -> a
log (Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (1Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a
z ))-- Take care to allow (-1)::Complex, fixing #8532acosh :: Complex a -> Complex a
acosh z :: Complex a
z =Complex a -> Complex a
forall a. Floating a => a -> a
log (Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ (Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (Complex a -> Complex a) -> Complex a -> Complex a
forall a b. (a -> b) -> a -> b
$ Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ 1)Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* (Complex a -> Complex a
forall a. Floating a => a -> a
sqrt (Complex a -> Complex a) -> Complex a -> Complex a
forall a b. (a -> b) -> a -> b
$ Complex a
z Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
- 1))atanh :: Complex a -> Complex a
atanh z :: Complex a
z =0.5Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
* Complex a -> Complex a
forall a. Floating a => a -> a
log ((1.0Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a
z )Complex a -> Complex a -> Complex a
forall a. Fractional a => a -> a -> a
/ (1.0Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
- Complex a
z ))log1p :: Complex a -> Complex a
log1p x :: Complex a
x @(a :: a
a :+ b :: a
b )|a -> a
forall a. Num a => a -> a
abs a
a a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<0.5Bool -> Bool -> Bool
&&a -> a
forall a. Num a => a -> a
abs a
b a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<0.5,a
u <-2a -> a -> a
forall a. Num a => a -> a -> a
* a
a a -> a -> a
forall a. Num a => a -> a -> a
+ a
a a -> a -> a
forall a. Num a => a -> a -> a
* a
a a -> a -> a
forall a. Num a => a -> a -> a
+ a
b a -> a -> a
forall a. Num a => a -> a -> a
* a
b =a -> a
forall a. Floating a => a -> a
log1p (a
u a -> a -> a
forall a. Fractional a => a -> a -> a
/ (1a -> a -> a
forall a. Num a => a -> a -> a
+ a -> a
forall a. Floating a => a -> a
sqrt (a
u a -> a -> a
forall a. Num a => a -> a -> a
+ 1)))a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a -> a -> a
forall a. RealFloat a => a -> a -> a
atan2 (1a -> a -> a
forall a. Num a => a -> a -> a
+ a
a )a
b |Bool
otherwise =Complex a -> Complex a
forall a. Floating a => a -> a
log (1Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
+ Complex a
x ){-# INLINElog1p #-}expm1 :: Complex a -> Complex a
expm1 x :: Complex a
x @(a :: a
a :+ b :: a
b )|a
a a -> a -> a
forall a. Num a => a -> a -> a
* a
a a -> a -> a
forall a. Num a => a -> a -> a
+ a
b a -> a -> a
forall a. Num a => a -> a -> a
* a
b a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<1,a
u <-a -> a
forall a. Floating a => a -> a
expm1 a
a ,a
v <-a -> a
forall a. Floating a => a -> a
sin (a
b a -> a -> a
forall a. Fractional a => a -> a -> a
/ 2),a
w <--2a -> a -> a
forall a. Num a => a -> a -> a
* a
v a -> a -> a
forall a. Num a => a -> a -> a
* a
v =(a
u a -> a -> a
forall a. Num a => a -> a -> a
* a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
u a -> a -> a
forall a. Num a => a -> a -> a
+ a
w )a -> a -> Complex a
forall a. a -> a -> Complex a
:+ (a
u a -> a -> a
forall a. Num a => a -> a -> a
+ 1)a -> a -> a
forall a. Num a => a -> a -> a
* a -> a
forall a. Floating a => a -> a
sin a
b |Bool
otherwise =Complex a -> Complex a
forall a. Floating a => a -> a
exp Complex a
x Complex a -> Complex a -> Complex a
forall a. Num a => a -> a -> a
- 1{-# INLINEexpm1 #-}-- | @since 4.8.0.0instanceStorable a =>Storable (Complex a )wheresizeOf :: Complex a -> Int
sizeOf a :: Complex a
a =2Int -> Int -> Int
forall a. Num a => a -> a -> a
* a -> Int
forall a. Storable a => a -> Int
sizeOf (Complex a -> a
forall a. Complex a -> a
realPart Complex a
a )alignment :: Complex a -> Int
alignment a :: Complex a
a =a -> Int
forall a. Storable a => a -> Int
alignment (Complex a -> a
forall a. Complex a -> a
realPart Complex a
a )peek :: Ptr (Complex a) -> IO (Complex a)
peek p :: Ptr (Complex a)
p =doPtr a
q <-Ptr a -> IO (Ptr a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr a -> IO (Ptr a)) -> Ptr a -> IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ Ptr (Complex a) -> Ptr a
forall a b. Ptr a -> Ptr b
castPtr Ptr (Complex a)
p a
r <-Ptr a -> IO a
forall a. Storable a => Ptr a -> IO a
peek Ptr a
q a
i <-Ptr a -> Int -> IO a
forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr a
q 1Complex a -> IO (Complex a)
forall (m :: * -> *) a. Monad m => a -> m a
return (a
r a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
i )poke :: Ptr (Complex a) -> Complex a -> IO ()
poke p :: Ptr (Complex a)
p (r :: a
r :+ i :: a
i )=doPtr a
q <-Ptr a -> IO (Ptr a)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr a -> IO (Ptr a)) -> Ptr a -> IO (Ptr a)
forall a b. (a -> b) -> a -> b
$ (Ptr (Complex a) -> Ptr a
forall a b. Ptr a -> Ptr b
castPtr Ptr (Complex a)
p )Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr a
q a
r Ptr a -> Int -> a -> IO ()
forall a. Storable a => Ptr a -> Int -> a -> IO ()
pokeElemOff Ptr a
q 1a
i -- | @since 4.9.0.0instanceApplicative Complex wherepure :: a -> Complex a
pure a :: a
a =a
a a -> a -> Complex a
forall a. a -> a -> Complex a
:+ a
a f :: a -> b
f :+ g :: a -> b
g <*> :: Complex (a -> b) -> Complex a -> Complex b
<*> a :: a
a :+ b :: a
b =a -> b
f a
a b -> b -> Complex b
forall a. a -> a -> Complex a
:+ a -> b
g a
b liftA2 :: (a -> b -> c) -> Complex a -> Complex b -> Complex c
liftA2 f :: a -> b -> c
f (x :: a
x :+ y :: a
y )(a :: b
a :+ b :: b
b )=a -> b -> c
f a
x b
a c -> c -> Complex c
forall a. a -> a -> Complex a
:+ a -> b -> c
f a
y b
b -- | @since 4.9.0.0instanceMonad Complex wherea :: a
a :+ b :: a
b >>= :: Complex a -> (a -> Complex b) -> Complex b
>>= f :: a -> Complex b
f =Complex b -> b
forall a. Complex a -> a
realPart (a -> Complex b
f a
a )b -> b -> Complex b
forall a. a -> a -> Complex a
:+ Complex b -> b
forall a. Complex a -> a
imagPart (a -> Complex b
f a
b )-- ------------------------------------------------------------------------------- Rules on Complex{-# RULES"realToFrac/a->Complex Double"realToFrac =\x ->realToFrac x :+ (0::Double)"realToFrac/a->Complex Float"realToFrac =\x ->realToFrac x :+ (0::Float)#-}

AltStyle によって変換されたページ (->オリジナル) /