数值的整数次方

看似简单的题目,相信刚开始学习编程语言时大家都编写过这题,我们先不考虑大数。

很多人可以马上写出

double Power(double base, int exponent)
{
    double result = 1.0;
    for(int i =1; i <= exponent ; ++i)
          result *=base;

    return result;
}    

明显这个代码存在很多问题:一,指数exponent为负数,零时怎么办,二,当底数为0,指数为负数时怎么办。

代码的鲁棒性也是需要考虑的重点。

bool g_InvalidInput = false; 

bool equal(double num1,double num2)
{
    if( ((num1-num2) > -0.000001) && ((num1-num2) < 0.000001) )
        return true;
    else
        return false;
}

//更高效的进行运算
double PowerWithUnsignedExponent(double base, int exponent)
{
    if( exponent  == 0)
        return 1;
    if( exponent  == 1)
        return base;

    double result = PowerWithUnsignedExponent(base,exponent>>1);//位运算比除法效率更高
    result *=result;
    if( exponent & 0x1 == 1) // 指数为奇数时
        result *=base;

    return result;
}    

double Power(double base, int exponent)
{
    g_InvalidInput = false;

    //注意double 类型与0的比较
    if( equal(base,0.0) && exponent < 0 )
    {
        g_InvalidInput = true;
        return 0.0;
    }

    unsigned int absExponent = (unsigned int )(exponent);
    if( exponent < 0 )
        absExponent = (unsigned int)(-exponent);

    double result = PowerWithUnsignedExponent(base,absExponent);
    if( exponent < 0 )
        result = 1.0/result;

    return result;
}

全局变量g_InvalidInput用来表示输入数字是否有效,可以通过检查它来判断。

采用递归的方法来进行指数运算效率更高,但是假如指数很大那么还是采用循环方法比较好。

posted @ 2013-03-02 22:42  没离开过  阅读(106)  评论(0)    收藏  举报