数值的整数次方

题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需考虑大数问题。

分析:直接想法解答:

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

但是,上面的解法是有问题的,如果输入的指数exponent小于1即是零和负数的时候怎么办?上面的代码只考虑了指数为正的情况。当指数为负数的时候可以求其绝对值,然后算出结果后求倒数,那么如果底数为0且指数为负就会出现错误。居于此我们需要采取三种方法:返回值,全局代码和异常。解决方式如下:

boll g_InvalidInput =false;

double Power(double base,int exponent)
{
    g_InvalidIput=false;
    if(equal(base,0.0)&&exponent<0)
    {
        g_InvalidInput=true;
        return 0.0;
    }
    
    unsigned int absExponent=(unsigned int)(exponent);
    if(expoennt<0)
        absExponent=(unsigned int)(-exoponent);
    
    double result=powerWithUnsignedExponent(base,absExponent);
    if(exponent<0)
        result=1.0/result;
        
    return result;
}

double PowerWithUnsignedExponent(double base,unsigned int exponent)
{
    double result=1.0;
    for(int i=1;i<=exponent;++i)
        result*=base;
    return result;
}

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

这里注意:在判断底数base是不是0时,不能直接的写base==0,这是因为在计算机内部表示小数的时候都有误差。判断两个小数是否相等时,只能判断他们之间的差的绝对值是不是在一个很小的范围内,如果差值很小,我们就认为他们相等,这就是我们定义函数equal的原因。

函数PowerWithUnsignedExponent其实还可以优化,如果指数为32,则要进行31次乘法,其实不用那么多,如果我们知道了这个数的16次方,只要在16次方的基础上平方以下就好,而16次方是8的次方的平方。以此类推求32次方其实只需要做5次乘法。基于此,改进如下:

double PowerWithUnsignedExponent(double base,unsigned 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;
}


你可能感兴趣的:(C++,数值整数次方,判断小数相等)