<- previous index next ->
Some complex functions may be computed accurately from the basic definition. But, preserving relative accuracy over the complete domain of a few complex functions requires special techniques. Note that the domain and range of complex functions may not be obvious to the average user. First, look at the mappings from domain z1 to range z2 for some complex functions: With Java applets enabled If this does not work, Complex Function Screen Shots Various identities for elementary functions in the complex plane, including implementing the complex function using only real functions. Let z = x + i y then arg z = arctan y/x real function using signs of x and y modulus z = sqrt(x*x+y*y) = |z| length of complex vector re z = x im z = y SQRT i (arg z)/2 sqrt z = sqrt(|z|) e thus yielding half the angle with magnitude sqrt(|z|) modulus z + re z modulus z - re z sqrt z = sqrt ---------------- +/- i sqrt ---------------- 2 2 where the sign of the imaginary part of the result is the sign of the imaginary part of z 2 3 z z z sqrt 1+z = 1 + - - -- + -- - ... 2 8 16 sqrt( 0 + i0) = 0 + i0 sqrt(-0 + i0) = 0 + i0 sqrt( 0 - i0) = 0 - i0 sqrt(-0 - i0) = 0 - i0 sqrt(z)**2 = z sqrt(z*z) = z re z > 0 sqrt(1/z) = 1/sqrt(z) not for -0 or negative real axis conjugate(sqrt(z)) = sqrt(conjugate(z)) not for -0 or negative real axis Branch cut: The branch cut lies along the negative real axis. Domain: Mathematically unbounded Range: Right half plane including the imaginary axis. The algebraic sign of the real part is positive. The sign of the imaginary part of the result is the same as the sign of im z. LOG log z = ln( modulus z) + i argument z 2 3 z z log 1+z = z - -- + -- - ... for |z| < 1 2 3 log(exp(z)) = z im z in [-Pi,Pi] log(1/z) = -log(z) not on negative real axis conjugate(log(z)) = log(conjugate(z)) not on negative real axis Branch cut: The branch cut lies along the negative real axis. Domain: Modulus z /= 0.0 Range: Real part mathematically unbounded, imaginary part in range - Pi to Pi The sign of the imaginary part of the result is the same as the sign of im z. EXP z re z re z e = e cos (im z) + i e sin (im z) i x e = cos(x) + i sin(x) 2 3 z z z e = 1 + z + -- + -- + ... 2! 3! z z+i 2Pi e = e periodic with period i 2Pi exp(-z) = 1/exp(z) not on negative real axis exp(log(z)) = z |z| non zero conjugate(exp(z)) = exp(conjugate(z)) Branch cut: None Domain: re z < ln 'LARGE Range: Mathematically unbounded For modulus z = 0.0, the result is 1.0 + z "**" w (w * ln z) z = e 2 3 w (w ln z) (w ln z) z = 1 + w ln z + --------- + --------- + ... for |z| non zero 2! 3! w log(z ) = w * log(z) SIN sin z = sin(re z) cosh(im z) + i cos(re z) sinh(im z) iz -iz e - e sin z = ----------- 2i 3 5 z z sin z = z - -- + -- - ... 3! 5! sin z = cos(z - Pi/2) periodic with period Pi sin(z) = sin(z+2Pi) sin z = -i sinh iz sin(arcsin(z)) = z sin(z) = -sin(-z) conjugate(sin(z)) = sin(conjugate(z)) Domain: |im z| < ln 'LARGE COS cos z = cos(re z) cosh(im z) - i sin(re z) sinh(im z) iz -iz e + e cos z = ----------- 2 2 4 z z cos z = 1 - -- + -- - ... 2! 4! cos z = sin(z + Pi/2) periodic with period Pi cos(z) = cos(z+2Pi) cos(z) = cos(-z) cos z = cosh iz cos(arccos(z)) = z conjugate(cos(z)) = cos(conjugate(z)) Domain: |im z| < ln 'LARGE TAN tan z = sin z / cos z iz -iz e - e tan z = -i ---------- limit = -i when im z > ln 'LARGE iz -iz limit = i when im z < - ln 'LARGE e + e 3 5 7 z 2z 17z tan z = z + -- + --- + ---- + ... for |z| < 1 3 15 315 sin x cos x sinh y cosh y tan z = ---------------- +i ---------------- 2 2 2 2 cos x + sinh y cos x + sinh y tan z = cot(Pi/2 - z) periodic with period Pi tan z = tan(z+2Pi) tan z = 1/cot z tan(z) = -tan(-z) tan z = -i tanh iz tan(arctan(z))=z conjugate(tan(z)) = tan(conjugate(z)) Branch cut: None Domain: Mathematically unbounded Range: Mathematically unbounded For modulus z = 0.0, the result is z COT cot z = cos z / sin z iz -iz e + e cot z = i ---------- limit = i when im z > ln 'LARGE iz -iz limit = -i when im z < -ln 'LARGE e - e sin x cos x sinh y cosh y cot z = ---------------- -i ---------------- 2 2 2 2 sin x + sinh y sin x + sinh y 3 5 1 z z 2z cot z = - - - - -- - --- - ... z 3 45 945 cot z = tan(Pi/2 - z) periodic with period Pi cot(z) = cot(z+2Pi) cot(z) = -cot(-z) cot z = 1/tan z conjugate(cot(z)) = cot(conjugate(z)) Branch cut: None Domain: Mathematically unbounded Range: Mathematically unbounded For modulus z = 0.0, the result is z ARCSIN 2 arcsin z = - i ln(i z + sqrt(1-z )) arcsin z = - i ln(i z + sqrt(1-z)*sqrt(1+z)) 3 5 7 z 3z 5z arcsin z = z + -- + --- + ---- + ... for |z| < 1 6 40 112 1 3 15 arcsin z = -i( ln(2iz) - --- - ---- - ----- - ... ) for |z| > 1 2 4 6 4z 32z 288z 2 arcsin z = arctan(z/sqrt(1-z )) fix re of result arcsin z = 2 2 1/2 2 2 1/2 arcsin(1/2 (x + 2 x + 1 + y ) - 1/2 (x - 2 x + 1 + y ) ) + i 2 2 1/2 2 2 1/2 csgn(-i x + y) ln(1/2 (x + 2 x + 1 + y ) + 1/2 (x - 2 x + 1 + y ) 2 2 1/2 2 2 1/2 2 1/2 + ((1/2 (x + 2 x + 1 + y ) + 1/2 (x - 2 x + 1 + y ) ) - 1) ) note: The csgn function is used to determine in which half-plane (`left' or `right') the complex-valued expression or number x lies. It is defined by / 1 if Re(x) > 0 or Re(x) = 0 and Im(x) > 0 csgn(x) = < -1 if Re(x) < 0 or Re(x) = 0 and Im(x) < 0 \ 0 if x = 0 arcsin z = pi/2 - arccos z arcsin z = -i arcsinh iz arcsin(sin(z)) = z Branch cut: The real axis not in [ -1.0, 1.0 ] Domain: Mathematically unbounded Range: Imaginary part mathematically unbounded, real part in [ -Pi/2, Pi/2 ] For modulus z = 0.0, the result is z ARCCOS 1+z 1-z arccos z = -i 2 ln( sqrt --- +i sqrt --- ) 2 2 2 arccos z = -i ln(z + i sqrt(1-z ) ) 3 5 Pi z 3z arccos z = -- - z - -- - -- - ... for |z| < 1 2 6 40 arccos z = -i( ln(2z) for |z| > 1/sqrt(epsilon) arccos z = 2 2 1/2 2 2 1/2 arccos(1/2 (x + 2 x + 1 + y ) - 1/2 (x - 2 x + 1 + y ) ) + i 2 2 1/2 2 2 1/2 csgn(I x - y) ln(1/2 (x + 2 x + 1 + y ) + 1/2 (x - 2 x + 1 + y ) 2 2 1/2 2 2 1/2 2 1/2 + ((1/2 (x + 2 x + 1 + y ) + 1/2 (x - 2 x + 1 + y ) ) - 1) ) 2 arccos z = arctan(sqrt(1-z )/z) fix re of result arccos z = pi/2 - arcsin z arccos(cos(z)) = z Branch cut: The real axis not in [ -1.0, 1.0 ] Domain: Mathematically unbounded Range: Imaginary part mathematically unbounded, real part in [ 0.0, Pi ] ARCTAN arctan z = -i ( ln(1 + i z) - ln(1 - i z) )/2 i i+z arctan z = - ln --- must be fixed on slit for iz < -1 2 i-z 3 5 7 z z z arctan z = z - -- + -- - -- + ... for |z| < 1 3 5 7 arctan z = Pi/2 - arccot z arctan z = arccot(1/z) arctan z = -i arctanh iz arctan(tan(z)) = z arctan z = 1/2 arctan(x, 1 - y) - 1/2 arctan(- x, y + 1) 2 2 x + (y + 1) +i 1/4 ln(-------------) 2 2 x + (y - 1) ARCCOT i z-i arccot z = - ln --- 2 z+i 3 5 Pi z z arccot z = -- - z + -- - -- + ... for |z| < 1 2 3 5 arccot z = Pi/2 - arctan z arccot z = arctan(1/z) arccot(cot(z)) = z arccot z = 1/2 Pi - 1/2 arctan(x, 1 - y) + 1/2 arctan(- x, y + 1) 2 2 x + (y + 1) -i 1/4 ln(-------------) 2 2 x + (y - 1) Range: Imaginary part mathematically unbounded, real part in [0.0 , Pi] SINH sinh z = sinh(re z) cos(im z) + i cosh(re z) sin(im z) z -z e - e sinh z = -------- 2 3 5 z z sinh z = z + -- + -- + ... 3! 5! sinh z = -i cosh(z +i Pi/2) periodic with period i Pi sinh z = -i sin iz COSH cosh z = cosh(re z) cos(im z) + i sinh(re z) sin(im z) z -z e + e cosh z = -------- 2 2 4 z z cosh z = 1 + -- + -- + ... 2! 4! cosh z = -i sinh(z +i Pi/2) periodic with period i Pi cosh z = cos iz TANH tanh z = sinh z / cosh z z -z e - e tanh z = -------- z -z e + e 3 5 7 z 2z 17z tanh z = z - -- + -- - ---- + ... for |z| < 1 3 15 315 tanh z = -i coth(z +i Pi/2) periodic with period i Pi tanh z = 1/coth z tanh z = -i tan iz sinh x cosh x sin y cos y tanh z = ---------------- +i ---------------- 2 2 2 2 sinh x + cos y sinh x + cos y COTH coth z = cosh z / sinh z z -z e + e coth z = -------- z -z e - e 3 5 1 z z 2z coth z = - + - - -- + --- - ... for |z| < 1 z 3 45 945 coth z = -i tanh(z +i Pi/2) coth z = 1/tanh z sinh x cosh x sin y cos y coth z = ---------------- -i ---------------- 2 2 2 2 sinh x + sin y sinh x + sin y ARCSINH 2 arcsinh z = ln(z + sqrt(1 + z ) ) 3 5 7 z 3z 5z arcsinh z = z - -- + --- - --- + ... for |z| < 1 6 40 112 1 3 15 arcsinh z = ln(2z) + --- - ---- + ----- - ... for |z| > 1 2 4 6 4z 32z 288z arcsinh z = -i arcsin iz arcsinh(sinh(z)) = z arcsinh z = 2 2 1/2 2 2 1/2 csgn(x + I y) ln(1/2 (x + y + 2 y + 1) + 1/2 (x + y - 2 y + 1) 2 2 1/2 2 2 1/2 2 1/2 + ((1/2 (x + y + 2 y + 1) + 1/2 (x + y - 2 y + 1) ) - 1) ) + i 2 2 1/2 2 2 1/2 arcsin(1/2 (x + y + 2 y + 1) - 1/2 (x + y - 2 y + 1) ) ARCCOSH z+i z-i arccosh z = 2 ln( sqrt --- + sqrt --- ) 2 2 arccosh z = ln(z + sqrt(z-1) sqrt(z+1) ) not sqrt(z**2-1) 1 3 15 arccosh z = ln(2z) - --- - ---- - ----- - ... for |z| > 1 2 4 6 4z 32z 288z arccosh(cosh(z)) = z arccosh z = 2 2 1/2 - csgn(I - I x + y) csgn(I x - y) ln(1/2 (x + 2 x + 1 + y ) 2 2 1/2 + 1/2 (x - 2 x + 1 + y ) 2 2 1/2 2 2 1/2 2 1/2 + ((1/2 (x + 2 x + 1 + y ) + 1/2 (x - 2 x + 1 + y ) ) - 1) ) + i csgn(I - I x + y) 2 2 1/2 2 2 1/2 arccos(1/2 (x + 2 x + 1 + y ) - 1/2 (x - 2 x + 1 + y ) ) ARCTANH arctanh z = ( ln(1+z) - ln(1-z) )/2 1 1+z arctanh z = - ln --- must fix up on slit for z > 1 2 1-z 3 5 7 z z z arctanh z = z + -- + -- + -- + ... for |z| < 1 3 5 7 arctanh z = -i arctan iz arctanh(tanh(z)) = z arctanh z = arccoth(z) + i Pi/2 2 2 (x + 1) + y arctanh z = 1/4 ln(-------------) 2 2 (x - 1) + y +i 1/2 arctan(y, x + 1) - 1/2 arctan(- y, 1 - x) ARCCOTH 1 z+1 arccoth z = - ln --- must fix up on slit 2 z-1 3 5 i Pi z z arccoth z = ---- + z + -- + -- + ... for |z| < 1 2 3 5 arccoth z = arctanh(z) +i Pi/2 arccoth z = arctanh(1/z) arccoth(coth(z)) = z 2 2 (x + 1) + y arccoth z = 1/4 ln(-------------) 2 2 (x - 1) + y +i 1/2 Pi + 1/2 arctan(y, x + 1) - 1/2 arctan(- y, 1 - x) Range: Real part mathematically unbounded, imaginary part in [0.0 , i Pi] There are many complex functions provided by Ada generic_complex_elementary_functions.ads Fortran 90 has a few complex functions complex_func.f90 source code complex_func_f90.out output Python has many complex functions test_complex.py source code test_complex_py.out output Haskell has many complex functions test_complex.hs source code test_complex_hs.out output Complex.hs Library module I programmed some complex functions in java. Complex.java source code MatLab overloads all functions that take floating point to also handle complex numbers.
<- previous index next ->