如何实现double Pow(double base,double ex)
如果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?
案例1:a^b
天然B(也即,一个int
型,以及^意味着权力不XOR):
正如你所说的,它可以用一个简单的重复乘法解决。但考虑更有效的方法,如正方形和乘法:
想想c * a^b
变量c为1;当然还有以下是有效的:a^0=1
,a^1=a
和a^b
与b>1
是a * 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))
和
有它自然的指数,所以...
实际上,它效率低下并且存在一个巨大的问题:计算机具有有限的小数精度,在计算过程中需要比实际结果更高的精度。如果你想要20个精确的十进制数字,你需要用例如精确的计算。 30(或其他一些数字> 20)。其他方式:如果你用你的CPU所能做的所有事情来计算,结果就不会那么准确(最后一些错误的数字)。如果您正在编写一些bignum库,您可能可以为较小的预期结果分配一个大型数据类型,但不适用于内置的CPU类型。
像Math.pow
这样的方法的真正实现是适用于某些CPU类型的高度专业化的算法,因此实际的错误数字错误保持尽可能小。另外,它也应该很快,这使得整个代码更加复杂。想知道它的外观如何:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要理解它的工作原理,需要相当多的数学和技术知识。
如果你没有很好的理由,别的花时间可能是更多的乐趣:)
谢谢你的回答,这就是我想知道的情况3! – 2014-11-01 06:43:34
为什么不使用['Math.Pow'](http://msdn.microsoft.com/en-us /library/system.math.pow(v=vs.110).aspx)? – Dmitry 2014-10-31 22:36:34
这个问题似乎是离题,因为它可能更适合http://math.stackexchange.com/ – 2014-10-31 22:44:26
@LB IEEE 754数学与真正的数学没有多大关系...... – 2014-10-31 22:54:39