码迷,mamicode.com
首页 > 其他好文 > 详细

数值的整数次方

时间:2014-11-26 19:20:25      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:数值整数次方;c++;判断小数相等

题目:实现函数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;
}


本文出自 “仙路千叠惊尘梦” 博客,请务必保留此出处http://secondscript.blog.51cto.com/9370042/1582783

数值的整数次方

标签:数值整数次方;c++;判断小数相等

原文地址:http://secondscript.blog.51cto.com/9370042/1582783

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!