示例#1
0
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 */
示例#2
0
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;
  }
示例#3
0
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 */
示例#4
0
// 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));
}