bool g_InvalidInput = false;
double Power(double base, unsigned exponent)
{
g_InvalidInput = false;
通过g_ValidInput来判断输入的底数是否为0的同时指数小于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);
//当指数小于0时结果为它的倒数
if (exponent < 0)
result = 1.0 / result;
return result;
}
//判断两数是否相等
bool equal(double num1, double num2)
{
if (num1 - num2<0.0000001&&num1 - num2>-0.000001)
return true;
else
return false;
}
double PowerWithUnsignedExponent(double base, unsigned int absExponent)
{
//当指数为0时返回1,指数为1时返回底数
if (absExponent == 0)
return 1;
if (absExponent == 1)
return base;
//指数右移一位,继续求
double result = PowerWithUnsignedExponent(base, absExponent >> 1);
//a^n = a^(1/2)*a^(`/2),n为偶数
//a^n = a^((n-1)/2)*((n-1)/2),n为奇数
result *= result;
//若指数为奇数,则还要再乘上底数
if ((absExponent & 0x1) == 1)
result *= base;
return result;
}