【问题解决】优化一个double数的exponent次方

double Pow(double base,int exponent);

优化之前的次方算法是将i从1遍历到exponent,ret *=ret;
代码如下

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

}

优化后是将x次方以递归计算
代码如下:

double PowNew(double base, unsigned int exponent)    //平方优化     
{                                                       /*将/2用移位操作符代替,判断奇数偶数可以将此数&0x1
                                                        a的x次方,可分解为a的x/2与a的x/2次方之积                                           */
    if (exponent == 0)
    {
        return 1;
    }
    if (exponent == 1)
    {
        return base;
    }
    double ret = PowNew(base, exponent >> 1);
    ret *= ret;
    if (exponent & 0x1== 1)
    {
        ret *= ret;
    }
    return ret;
}

整体代码如下

#include<iostream>
#include<iomanip>
using namespace std;

int baseis0;
bool equal(double base)
{
    if (base - 0.0 < 0.0000001)
    {
        return true;
    }
    else
    {
        return false;
    }
}

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

}

double PowNew(double base, unsigned int exponent)    //平方优化     
{                                                       /*将/2用移位操作符代替,判断奇数偶数可以将此数&0x1
                                                        a的x次方,可分解为a的x/2与a的x/2次方之积                                           */
    if (exponent == 0)
    {
        return 1;
    }
    if (exponent == 1)
    {
        return base;
    }
    double ret = PowNew(base, exponent >> 1);
    ret *= ret;
    if (exponent & 0x1== 1)
    {
        ret *= ret;
    }
    return ret;
}
double Power(double base, int exponent)
{
    double ret;
    unsigned us_int;
    int buf;
    if (exponent < 0)
    {
        buf = 0 - exponent;
    }
    us_int = buf;
    if (equal(base))
    {
        baseis0 = 1;
        return 0.0;
    }
    else
    {
        if (exponent < 0)
        {
            ret = PowNew(base, us_int);
            ret = 1 / ret;
        }
        else if (exponent == 0)
        {
            ret = 1;
        }
        else
        {
            ret = PowerWithUnsigne(base, us_int);
        }
    }
    return ret;
}

void main()
{
    double base = 4.5;
    int exponent = -9;

    cout<< Power(base, exponent) << endl;
    system("pause");
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值