“最不能容忍的功能错误,忽略边界情况。必须保证功能测试、边界测试、负面测试以及性能测试”
------尹彦(Intel)
问题:数值的整数次方double Power(double base,int exponent) { double result=0.0; for(int i=0;i<exponent;i++) result*=base; return result; }很多人看见题目都能想到这儿,于是随手写下了这段代码。对于一般的整数的次方确实可以解决,但是这能远观不能近看。细细一品,漏洞百出啊!
#include <iostream> #include <math.h> using namespace std; bool InvalidInput=false; double PowerwihtUnsignedExponent(double base,unsigned int exponent) { double result=1.0; for( unsigned int i=0;i<exponent;i++) result*=base; return result; } bool equals(double num1,double num2) { if(fabs(num1-num2)<0.0000001) return true; else return false; } double Power(double base,int exponent) { InvalidInput=false; if(equals(base,0.0) || base<0 ) //base为<=0; { InvalidInput=true; cout<<"INVALID INPUT"<<endl; return 0.0; } if(0==exponent) //base^0次方; { return 1.0; } if(1==exponent) { return base; } unsigned int absExponent=(unsigned int)(exponent); if(exponent<0) //指数为负数 absExponent=(unsigned int)(-exponent); double result=PowerwihtUnsignedExponent(base,absExponent); if(exponent<0) result=1.0/result; return result; } int main() { double result=Power(0,3); if(InvalidInput==true)//此处一定要对应用的结果进行InvalidInput检查,看是否正常返回还是出错; cout<<"INVALID INPUT!"<<endl; else cout<<Power(0,3)<<endl; system("pause"); return 0; }
运行结果:
答案是肯定的。看下面的公式你就明白了!
所以:PowerWithUsignedExponent代码如下:
double PowerwihtUnsignedExponent(double base,unsigned int exponent) { double result=1.0; result=PowerwihtUnsignedExponent(base,exponent>>1); result*=result; if((exponent& 0x1)==1)//为奇数; result*=base; return result; }
我们用右移运算代替了除2,用位&运算代替了%运算符,这又使代码的效率提高了很多。