1、题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,不考虑大数问题。
解法:当指数为负数的时候,可以先对指数求绝对值,然后算出次方的结果之后再取倒数。当底数是0且指数是负数的时候,如果不做特殊处理,就会出现对0求倒数从而导致程序运行出错。
怎么告诉函数的调用者出现了这种错误?
三种方法:返回值。全局代码。异常。
bool g_InvalidInput = false;
double Power(double base, int exponent)
{
g_InvalidInput = false;
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);
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;
}
我们采用全局变量来表示是否出错。若出错则返回0。为了区分是出错返回的0还是底数为0的时候正常运行返回的0,还定义了一个全局变量g_InvalidInput。当出错时,此变量被设为true,否则为false。
这样的好处是,可以把返回值直接传递给其他变量,比如写double result = Power(2,3),也可以把函数的返回值直接传递给其他需要double型参数的函数。但缺点是这个函数的调用者有可能会忘记去检查g_InvalidInput以判断是否出错,留下了安全隐患。
注意:判断两个小数是否相等,只能判断他们之差的绝对值是不是在一个很小的范围内。如果两个数相差很小,就可以认为他们相等。