Beispiel #1
0
/*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;
}
Beispiel #2
0
/*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;
}
Beispiel #3
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;
}
Beispiel #4
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;
}
double	       dcoshs(double x) {
  double y = dexps(dabss(x));
  return (0.5 * (y + 1.0/y));
}