在Java中不使用Math.pow实现通用电源功能

时间:2010-12-15 18:19:09

标签: java

我想在java中编写一个程序,它将执行一个提升到幂的数字,但不使用math.pow。该程序应该是通用的,以包括分数。 循环增量方法将增加1,这对于整数是可以的;但不是分数。请建议一个对我有帮助的通用方法。

3 个答案:

答案 0 :(得分:4)

首先,观察pow(a,x)= exp(x * log(a))。

您可以使用Taylor series扩展来实现自己的exp()函数 Ë X

e x = 1 + x + x 2 / 2! + x 3 / 3! + x 4 / 4! + x 5 / 5! + ...

这适用于x的非整数值。您包含的术语越多,越多 准确的结果将是。

请注意,通过使用某些代数同一性,您只需要在0 <0的范围内求助于x的级数展开。 x&lt; 1。 exp(int + frac)= exp(int)* exp(frac),并且不需要对exp(int)使用系列扩展。 (你只是把它加倍, 因为它的整数幂 e = 2.71828 ......)。

同样,您可以使用以下系列扩展之一实现log(x):

log(1 + x)= x - x 2 / 2 + x 3 / 3 - x 4 / 4 + ..

log(1-x)= -1 *(x + x 2 / 2 + x 3 / 3 + x 4 / 4 + ......)

但是这些序列仅在区间-1 a ,您可能必须使用标识

log(pq)= log(p)+ log(q)

并通过 e (= 2.71828 ...)进行一些重复划分,将 a 降低到一个范围内 系列扩张趋同。例如,如果a = 4,则必须取x = 3 使用第一个公式,但3是在收敛范围之外。所以我们开始吧 除以e的因素:

4 / e = 1.47151 ......

log(4)= log(e * 1.47151 ...)= 1 + log(1.47151 ...)

现在我们可以在收敛范围内取x = .47151 ..., ,并使用系列扩展来评估log(1 + x)。

答案 1 :(得分:0)

考虑一下权力函数应该做什么。

数学上:x ^ 5 = x * x * x * x * x,或((((x * x)* x)* x)* x)

在for循环中,您可以使用* =运算符来实现上面发生的操作。

你是如何处理分数的? Java没有内置的分数类型;它存储的小数将以与整数相同的方式计算(换句话说,x * x适用于两种类型)。如果你有一个特殊的分数类,你的循环只需要两个步骤:一个乘以分子,一个乘以分母。

答案 2 :(得分:0)

在阅读Wikipedia上的权力时:

a^x = exp( x ln(a) ) for any real number x

这是作弊吗?