首先,尊重原版,这是我参考的内容。
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));
}
}
计算的结果也很相近