2014-10-31 64 views
-3

如果exponent是int,那么我可以运行循环“ex”次。如何实现double Pow(double base,double ex)

如果base = 2,EX = 0.5这样:

2^0.5 = sqrt(2) 

如果base = 2,EX = 1.5这样:

2^1.5 = sqrt(2^3) 

所有我认为是与一些如果它(如果前int?if ex negative?)

是否有一个很好的方法来实施Pow?

+10

为什么不使用['Math.Pow'](http://msdn.microsoft.com/en-us /library/system.math.pow(v=vs.110).aspx)? – Dmitry 2014-10-31 22:36:34

+0

这个问题似乎是离题,因为它可能更适合http://math.stackexchange.com/ – 2014-10-31 22:44:26

+0

@LB IEEE 754数学与真正的数学没有多大关系...... – 2014-10-31 22:54:39

回答

5

案例1
a^b天然B(也即,一个int型,以及^意味着权力不XOR):
正如你所说的,它可以用一个简单的重复乘法解决。但考虑更有效的方法,如正方形和乘法:
想想c * a^b变量c为1;当然还有以下是有效的:
a^0=1a^1=aa^bb>1a * a^(b-1)

如果B是偶数,a^b(a^2)^(b/2),在代码风格(a*a)^(b>>1)。如果您想到变量a和b,只需制作a=a*a;b=b>>1;,并且只用一次乘法和移位即可将指数减半。 而不是(b/2)循环迭代。只要重复整个事情,直到你经常将b分为1,那么a就是你的结果。

如果b在某个过程中甚至没有出现:
现在c很重要:最初它是1,现在是1,它现在乘以a。 c=c*a;
如果您记得c * a^b,现在可以将b减1,因为其中有一个a。
现在继续像上面那样的偶数b ...
每次你有一个不均匀的指数,让c积累的因素得到一个偶数b。
如果b为最后1,c*a是你的最终结果(it's c*a每次:如果没有凹凸不平B,C仍然是1)

案例2
a^b阴性B(无论是自然不)
这很容易:a^(-b) = 1/(a^b)是一个基本的数学规则。
也就是说。忽略b先是负数,但是取反的结果。

案例3
通用实数。
那么,在理论a^b = e^(b*ln(a))
Exp
Log
有它自然的指数,所以...

实际上,它效率低下并且存在一个巨大的问题:计算机具有有限的小数精度,在计算过程中需要比实际结果更高的精度。如果你想要20个精确的十进制数字,你需要用例如精确的计算。 30(或其他一些数字> 20)。其他方式:如果你用你的CPU所能做的所有事情来计算,结果就不会那么准确(最后一些错误的数字)。如果您正在编写一些bignum库,您可能可以为较小的预期结果分配一个大型数据类型,但不适用于内置的CPU类型。

Math.pow这样的方法的真正实现是适用于某些CPU类型的高度专业化的算法,因此实际的错误数字错误保持尽可能小。另外,它也应该很快,这使得整个代码更加复杂。想知道它的外观如何:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要理解它的工作原理,需要相当多的数学和技术知识。
如果你没有很好的理由,别的花时间可能是更多的乐趣:)

+0

谢谢你的回答,这就是我想知道的情况3! – 2014-11-01 06:43:34

相关问题