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");
}