Math.pow函数的重写

首先,尊重原版,这是我参考的内容。

http://blog.csdn.net/xiaoxiongli/article/details/2134626


今天一个同学问我怎么实现pow函数的功能,我想着,简单啊,循环然后*=就出来了啊。

但是一操作不是那么回事。

找了很久也没找到这个函数的源码,结果在一个C++群里面问到了这篇文章,怪我度娘没用好,居然没搜到上面的文章。

话不多说,上源码。


package com.neusoft.arithmetic.sample;

public class Pow {

	public static void main(String[] args) {
		double num = 10;
		double m = 4.09;
		System.out.println("Java's pow anwser is = " + Math.pow(num, m));
		System.out.println("m为整形时得到的结果 = "+pow_ff(num, m));
		System.out.println("m为Double类型时得到的结果 = "+pow_ff(num, m));
	}

	/*
	 * double pow_i(double num,int n);//计算num的n次幂,其中n为整数 double pow_f(double
	 * num,double m);//计算num的m次幂,num和m可为双精度,num大于零小于2 double pow_ff(double
	 * num,double m);//调用pow_f()和pow_i(),计算num的m次幂,是计算幂的入口
	 */

	public static double pow_i(double num, int n)// 计算num的n次幂,其中n为整数
	{
		double powint = 1;
		int i;
		for (i = 1; i <= n; i++)
			powint *= num;
		return powint;
	}

	public static double pow_f(double num, double m)// 计算num的m次幂,num和m可为双精度,num大于零
	{
		int i, j;
		double powf = 0, x, tmpm = 1;
		x = num - 1;
		for (i = 1; tmpm > 1e-12 || tmpm < -1e-12; i++)// 当tmpm不在次范围时,停止循环,范围可改
		{
			for (j = 1, tmpm = 1; j <= i; j++)
				tmpm *= (m - j + 1) * x / j;
			powf += tmpm;
		}
		return powf + 1;
	}

	public static double pow_ff(double num, double m)// 调用pow_f()和pow_i(),计算num的m次幂,是计算幂的入口
	{
		if (num == 0 && m != 0)
			return 0;// 若num为0,则返回0
		else if (num == 0 && m == 0)
			return 1;// 若num和m都为0,则返回1
		else if (num < 0 && m - (int) (m) != 0)
			return 0;// 若num为负,且m不为整数数,则出错,返回0
		if (num > 2)// 把底数大于2的情况转为(1/num)^-m计算
		{
			num = 1 / num;
			m = -m;
		}
		if (m < 0)
			return 1 / pow_ff(num, -m);// 把指数小于0的情况转为1/num^-m计算
		if (m - (int) (m) == 0)
			/*
			 * 当指数为浮点数是,分成整数和小数分别求 幂,这是因为但底数较小式,用pow_f直接求幂误差大
			 * ,所以分为指数的整数部分用pow_i,小 数部分用pow_f求.
			 */
			return pow_i(num, (int) m);
		else
			return pow_f(num, m - (int) (m)) * pow_i(num, (int) (m));
	}
}


计算的结果也很相近


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值