- 题目描述:
-
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
double pow(double base,int exp)应该考虑特殊的情况:
1) base == 0.0 && exp < 0 没有意义,因为在求一个数的负数次方的时候,是先求出这个数的整数次方,然后求 倒数。
2) base==0.0 && exp==0 也没有意义 。
第二点:注意判断两个浮点数类型的大小,是不能直接用等号来判断的。
bool isEqual(double a,double b)//判断两个double 类型是否相等
{
if(a-b>-1e-6&&a-b<1e-6)
{
return true;
}
else
return false;
}
第三点:求 一个数的 n (无符号整数)次方可以用递归来实现
double unsignedpow(double base, unsigned int exp)
{
if(exp==0)
return 1.0;
if(exp==1)
return base;
double result=unsignedpow(base,exp>>2);//exp是一个无符号数右移时,是逻辑右移,相当于除2
result*=result;
if(exp&0x1)//表示exp是一个奇数
result*=base;
return result;
}
这下我们可以完整的写出我们的程序了
bool flags=true;
double pow(double base,int exponent)
{
if(isEqual(base,0.0)&&exponent<=0)
{
flags=false;
return 1.0;//表示出错。
}
if(isEqual(base,1.0))
{
return 1.0;
}
unsigned int exp;
if(exponent<0)//是负数,
{
exp=(unsigned int)(-exp);
}
else
{
exp=(unsigned int)(exp);
}
//exp是一个正数;
//
double result=unsignedpow(base,exp);
if(exponent<0)
result=1.0/result;
return result;
}