// complexf.cpp implementation of complexf.h // fuller set of complex functions #include "complexf.h" static double PI = 3.1415926535897932384626433832795028841971 ; static double PI_2 = PI/2.0; static double LOG_TWO = 0.6931471805599453094172321214581765680755 ; static complex COMPLEX_I = complex(0.0, 1.0); complex cot(complex &z) { return cos(z)/sin(z); } complex acot(complex &z) { complex r; r = COMPLEX_I * log((z-COMPLEX_I)/(z+COMPLEX_I)) / 2.0 ; if(real(r) < 0.0) r = PI + r; // insure principal value return r; } complex coth(complex &z) { return cosh(z)/sinh(z); } complex asinh(complex &z) { complex r; r = log( z + sqrt(1.0 + z*z)); if(imag(r) > PI_2) // insure principal value r = complex(real(r), PI-imag(r)); else if(imag(r) < -PI_2) r = complex(real(r), -(PI+imag(r))); return r; } complex acosh(complex &z) { complex r; r= 2.0 * log( sqrt((1.0+z)/2.0) + sqrt((z-1.0)/2.0)); if(real(r) <= 0.0) r = -r; // insure principal value return r; } complex atanh(complex &z) { return (log(1.0 + z) - log(1.0 - z))/2.0 ; } complex acoth(complex &z) { complex r; r = log (( 1.0 + z ) / ( z - 1.0 )) / 2.0; if(imag(r) < 0.0) r=r+complex(0.0,PI); // insure principal value return r; } complex acos(complex &z) { complex r; r = - COMPLEX_I * log(z + COMPLEX_I*sqrt(1.0-z*z)); if(real(r) < 0.0) // insure principal result r = complex(-real(r), imag(r)); return r; } complex asin(complex &z) { complex r; r = -COMPLEX_I * log( COMPLEX_I*z + sqrt(1.0-z*z)); if(real(r) > PI_2) // insure principal value r = complex(PI-real(r), imag(r)); else if(real(r) < -PI_2) r = complex(-(PI+real(r)), imag(r)); return r; } complex atan(complex &z) { return -COMPLEX_I * (log(1.0+COMPLEX_I*z) -log(1.0-COMPLEX_I*z)) / 2.0 ; } complex tan(complex &z) { return sin(z)/cos(z); } complex tanh(complex &z) { return sinh(z)/cosh(z); }