complex Sqrtz(complex z) /* rz = sqrt( z) */ { complex rz; double r,th,abz; abz = Magz( z); if( abz == INFINITY){ rz = InfSetofComplex(); return rz; } if( z.x == 0.0 && z.y == 0.0){ rz = ZeroSetofComplex(); return rz; } if( z.y == 0.0){ if( z.x > 0.0) rz = MakeComplex( sqrt( z.x), 0.0); else rz = MakeComplex( 0.0, sqrt( fabs( z.x))); } else{ r = Magz( z); th = Argz( z) / 2; rz.x = sign( cos( th)) * sqrt( ( r + z.x)/2); rz.y = sign( sin( th)) * sqrt( ( r - z.x)/2); } return rz; } /* end. Sqrtz */
complex tanz(complex z) /* rz = tan( z) */ { complex rz; complex s,c; if( z.x == 0.0 && z.y == 0.0){ rz = ZeroSetofComplex(); return rz; } if( z.x != 0.0 && z.y == 0.0){ rz = MakeComplex( tan( z.x), 0.0); return rz; } if( z.x == 0.0 && z.y != 0.0){ rz = MakeComplex( 0.0, tanh( z.y)); return rz; } if( z.x != 0.0 && z.y != 0.0){ s = sinz( z); c = cosz( z); TRY { rz = Divz( s, c); return rz; } CATCH (EX_DIVZ) { rz = NaNSetofComplex(); THROW (EX_TANZ); return rz; } ENDTRY; }
complex Divz(complex z1, complex z2) /* rz = z1 / z2 */ { complex rz; double abx2,aby2,abz1,abz2,s,temp; abz1 = Magz(z1); abz2 = Magz(z2); abx2 = fabs(z2.x); aby2 = fabs(z2.y); if( abz2 == 0.0){ if( abz1 == 0.0 || abz1 == INFINITY){ rz = NaNSetofComplex(); THROW (EX_DIVZ); return rz; } /* in case of 0/0 or Inf/0 */ else{ rz = InfSetofComplex(); return rz; } /* in case of z/0 */ } if( abz2 == INFINITY){ if( abz1 == 0.0 || abz1 == INFINITY){ rz = NaNSetofComplex(); THROW (EX_DIVZ); return rz; } /* in case of 0/Inf or Inf/Inf */ else{ rz = ZeroSetofComplex(); return rz; } /* in case of 0/z */ } if( z1.x != 0.0 && z1.y == 0.0 && z2.x != 0.0 && z2.y == 0.0){ rz = MakeComplex( z1.x / z2.x, 0.0); return rz; } if( z1.x == 0.0 && z1.y != 0.0 && z2.x == 0.0 && z2.y != 0.0){ rz = MakeComplex( z1.y / z2.y, 0.0); return rz; } else{ if( abx2 >= aby2){ temp = z2.y / z2.x; s = z2.x + z2.y * temp; rz.x = ( z1.x + z1.y * temp ) / s; rz.y = ( -z1.x * temp + z1.y ) / s; } else{ temp = z2.x / z2.y; s = z2.x * temp + z2.y; rz.x = ( z1.x * temp + z1.y ) / s; rz.y = ( -z1.x + z1.y * temp ) / s; } } return rz; } /* end. Divz */
// W^n_N = exp(-i2pin/N) // = cos(2 pi n/N) - isin(2 pi n/N) static inline osk_complex_t twiddle(int n, int Nin) { float theta = (float)(2.0f*M_PI*n / Nin); return MakeComplex((float)cos(theta), (float)-sin(theta)); }