题目来自剑指Offer,描述:
实现函数double pow(double base, unsigned exponent)
这里有几个注意点:
1. exponent有可能为正为负
2. 当base 为0,exponent为负数时,此时结果数学上并没有定义
3. 数学公式的使用:
a^(n/2)*a^(n/2) n为偶数
a^n = a^((n-1)/2)*a^((n-1)/2) *a n为奇数
具体代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
bool valid_input = false; //根据该值判断输入是否有效
bool equal(double num1, double num2) //判断两个值是否相等
{
if(num1-num2>-1e-6&& num1-num2<1e-6)
return true;
return false;
}
// a^(n/2)*a^(n/2) n为偶数
//a^n =
// a^(n/2)*a^(n/2)*a n为奇数
//
double pow_with_unsigned(double base, unsigned int exponent)
{
if(exponent == 0) //任何数的0次幂都为1
return 1;
if(exponent == 1)
return base;
double result = pow_with_unsigned(base, exponent>>1);
result *= result;
if(exponent & 0x01 == 1) //指数为奇数
result *= base;
return result;
}
double pow(double base, int exponent)
{
valid_input = false;
if(equal(base, 0.0) && exponent<0) //当底数为0,其幂为负数时,指定输入无效,其返回0(1也可以,代表输入有误)
{
valid_input = true;
return 0.0; //底数为0,且指数小于0,返回0.0,并标志输入无效
}
unsigned int abs_exponent = (unsigned int)exponent;
if(exponent<0)
abs_exponent = (unsigned int)(-exponent);
double result = pow_with_unsigned(base, abs_exponent);
if(exponent < 0) //指数小于0,求结果的倒数
result = 1.0/result;
return result;
}
int main(void)
{
double rel = pow(0, -3);
cout << rel << endl;
return 0;
}