问题描述:
实现Power(double base,int exponent),求base的exponent次方,不考虑大数问题。
分析:
指数小于0时,得到正数部分,最后结果要取倒数;而指数为0且底数为0时就错误,因为0不能取倒数
代码实现:
bool g_InvalidInput = false;
bool is_0(double base)
{
return base >= (-1e-6) && base <= (1e-6); //1e-6即10的-6次方
}
double PowerWithUnsignedExponent(double base, int exponent)
{
/* 实现一,还能更高效
double result = 1.0;
for (int i = 0; i < exponent; i++)
result *= base;
return result;*/
//实现2
if (exponent == 0) //指数为0
return 1.0;
if (exponent == 1) //指数为1
return base;
double result = PowerWithUnsignedExponent(base, exponent >> 1); //求16次方 == 8次方*8次方
result *= result;
if (exponent & 0x1 == 1) //为奇数的话,则还要在乘一次
result *= base;
return result;
}
double Power(double base, int exponent)
{
g_InvalidInput = false; //防止其他代码之前修改过,需要置为false
if (is_0(base) && exponent < 0) //底数为0,指数为负,取反时会出问题
{
g_InvalidInput = true;
return 0.0;
}
if (exponent == 0 && is_0(base)) //指数底数都是0
return 0.0;
unsigned int absExponent = (unsigned int)(exponent);
if (exponent < 0) //指数小于0,得到其有效数值
absExponent = (unsigned int)(-exponent);
double result = PowerWithUnsignedExponent(base, exponent);
if (exponent < 0) //指数小于0,取倒
result = 1.0 / result;
return result;
}
3种错误处理的方法:
方法一:返回值告诉调用方
方法二:设置全局变量
方法三:抛出异常
3种方式的比较: