自己实现pow(double base, unsigned exponent)

题目来自剑指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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值