/*dwpowe*/ int iPowerRealScalarByComplexScalar( double _dblReal1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut) { if (_dblImg2 == 0) { //R ^ R int iComplex = 0; iPowerRealScalarByRealScalar( _dblReal1, _dblReal2, _pdblRealOut, _pdblImgOut, &iComplex); } else { //R ^ C if (_dblReal1 != 0) { //R* ^ C double dblRealTemp = 0; double dblImgTemp = 0; wlog(_dblReal1, 0, &dblRealTemp, &dblImgTemp); C2F(wmul)(&dblRealTemp, &dblImgTemp, &_dblReal2, &_dblImg2, &dblRealTemp, &dblImgTemp); dblRealTemp = dexps(dblRealTemp); *_pdblRealOut = dblRealTemp * dcoss(dblImgTemp); *_pdblImgOut = dblRealTemp * dsins(dblImgTemp); } else { //0 ^ C if (_dblReal2 > 0) { //0 ^ (r E R*+ ) & ( c E R ) *_pdblRealOut = 0; *_pdblImgOut = 0; } else if (_dblReal2 < 0) { //0 ^ (r E R*- ) & ( c E R ) //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; } else //_dblReal2 == 0, NaN { //0 ^ (r = 0 ) & ( c E R ) *_pdblRealOut = 1; *_pdblImgOut = 0; } } } return 0; }
void dcossTest(void) { double in[]=SOURCE; double res[]=RESULT; double out; int i; for (i=0;i<200;i++){ out=dcoss(in[i]); assert(( (fabs(out-res[i]))/(fabs(out)) )<3e-16); } }
/*wwpowe*/ int iPowerComplexScalarByComplexScalar( double _dblReal1, double _dblImg1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut) { if (_dblImg2 == 0) { //C ^ R iPowerComplexScalarByRealScalar( _dblReal1, _dblImg1, _dblReal2, _pdblRealOut, _pdblImgOut); } else { //C ^ C if (dabss(_dblReal1) + dabss(_dblImg1) != 0) { // ! 0 ^ C double dblRealTemp = 0; double dblImgTemp = 0; wlog(_dblReal1, _dblImg1, &dblRealTemp, &dblImgTemp); C2F(wmul)(&dblRealTemp, &dblImgTemp, &_dblReal2, &_dblImg2, &dblRealTemp, &dblImgTemp); dblRealTemp = dexps(dblRealTemp); *_pdblRealOut = dblRealTemp * dcoss(dblImgTemp); *_pdblImgOut = dblRealTemp * dsins(dblImgTemp); } else { // 0 ^ C //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; } } return 0; }
/*ddpowe*/ int iPowerRealScalarByRealScalar( double _dblReal1, double _dblReal2, double *_pdblRealOut, double *_pdblImgOut, int *_piComplex) { //exposant is an integer if ((int)_dblReal2 == _dblReal2) { //dipowe int iReal2 = (int)_dblReal2; if (iReal2 == 1) { //R ^ 1 *_pdblRealOut = _dblReal1; *_pdblImgOut = 0; *_piComplex = 0; } else if (iReal2 == 0) { //R ^ 0 *_pdblRealOut = 1; *_pdblImgOut = 0; *_piComplex = 0; } else if (iReal2 < 0) { //R ^ Z- if (_dblReal1 != 0) { //R* ^ Z- *_pdblRealOut = pow(_dblReal1, iReal2); *_pdblImgOut = 0; *_piComplex = 0; } else { //0 ^ 0 //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; *_piComplex = 0; } } else { //R ^ Z*+ ( N* ) *_pdblRealOut = pow(_dblReal1, iReal2); *_pdblImgOut = 0; *_piComplex = 0; } } else { if (_dblReal1 > 0) { //R*+ ^ R *_pdblRealOut = pow(_dblReal1, _dblReal2); *_pdblImgOut = 0; *_piComplex = 0; } else if (_dblReal1 < 0) { //R*- ^ R double dblRealTemp = 0; double dblImgTemp = 0; wlog(_dblReal1, 0, &dblRealTemp, &dblImgTemp); dblRealTemp = dexps(dblRealTemp * _dblReal2); dblImgTemp = dblImgTemp * _dblReal2; *_pdblRealOut = dblRealTemp * dcoss(dblImgTemp); *_pdblImgOut = dblRealTemp * dsins(dblImgTemp); *_piComplex = 1; } else if (_dblReal1 == 0) { //0 ^ R if (_dblReal2 < 0) { //0 ^ R*- //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; *_piComplex = 0; } else if (_dblReal2 == 0) { //0 ^ 0 //never call, pass in R ** 0 before *_pdblRealOut = 1; *_pdblImgOut = 0; *_piComplex = 0; } else if (_dblReal2 > 0) { //0 ^ R*+ *_pdblRealOut = 0; *_pdblImgOut = 0; *_piComplex = 0; } else //_dblReal2 is NaN { *_pdblRealOut = _dblReal2; *_pdblImgOut = 0; *_piComplex = 0; } } else //_dblReal1 is NaN { *_pdblRealOut = _dblReal1; *_pdblImgOut = 0; *_piComplex = 0; } } return 0; }
/*wdpowe*/ int iPowerComplexScalarByRealScalar( double _dblReal1, double _dblImg1, double _dblReal2, double* _pdblRealOut, double* _pdblImgOut) { if ((int)_dblReal2 == _dblReal2) { //C ^ Z if (_dblReal2 == 0) { //C ^ 0 *_pdblRealOut = 1; *_pdblImgOut = 0; } else if (_dblReal2 < 0) { //C ^ Z*- if (dabss(_dblReal1) + dabss(_dblImg1) != 0) //_dblReal1 != 0 || _dblImg1 != 0 ? { int i = 0; double dblOne = 1; double dblZero = 0; double dblRealTemp = 0; double dblImgTemp = 0; C2F(wdiv)(&dblOne, &dblZero, &_dblReal1, &_dblImg1, _pdblRealOut, _pdblImgOut); dblRealTemp = *_pdblRealOut; dblImgTemp = *_pdblImgOut; for (i = 2 ; i <= dabss(_dblReal2) ; i++) { C2F(wmul)(&dblRealTemp, &dblImgTemp, _pdblRealOut, _pdblImgOut, _pdblRealOut, _pdblImgOut); } } else { //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; } } else { //C ^ Z*+ int i = 0; double dblRealTemp = 0; double dblImgTemp = 0; *_pdblRealOut = _dblReal1; *_pdblImgOut = _dblImg1; dblRealTemp = *_pdblRealOut; dblImgTemp = *_pdblImgOut; for (i = 2 ; i <= dabss(_dblReal2) ; i++) { C2F(wmul)(&dblRealTemp, &dblImgTemp, _pdblRealOut, _pdblImgOut, _pdblRealOut, _pdblImgOut); } } } else { if (dabss(_dblReal1) + dabss(_dblImg1) != 0) { //C ^ R double dblRealTemp = 0; double dblImgTemp = 0; wlog(_dblReal1, _dblImg1, &dblRealTemp, &dblImgTemp); dblRealTemp = dexps(dblRealTemp * _dblReal2); dblImgTemp = dblImgTemp * _dblReal2; *_pdblRealOut = dblRealTemp * dcoss(dblImgTemp); *_pdblImgOut = dblRealTemp * dsins(dblImgTemp); } else { if (_dblReal2 > 0) { //0 ^ R*+ *_pdblRealOut = 0; *_pdblImgOut = 0; } else if (_dblReal2 < 0) { //0 ^ R*- //FIXME : ieee //generate +Inf double dblZero = 0.0; *_pdblRealOut = 1.0 / (dblZero); *_pdblImgOut = 0; } else { //0 ^ 0 *_pdblRealOut = 1; *_pdblImgOut = 0; } } } return 0; }