我如何实现双Pow(双基,双ex)

时间:2014-10-31 22:35:23

标签: c# algorithm

如果exponent为int,那么我可以为" ex"运行循环。次。

如果base = 2,则ex = 0.5 so:

2 ^ 0.5 = sqrt(2)

如果base = 2,则ex = 1.5所以:

2 ^ 1.5 = sqrt(2^3)

我认为所有内容都在其中(如果是ex int?如果是否为负?)

有没有一种很好的方法来实施Pow?

1 个答案:

答案 0 :(得分:5)

案例1
a^b具有自然b(即a int - 类型,^表示功率不是XOR):
正如你所说,它可以通过简单的重复乘法来解决。但是考虑更有效的方法,如square和multiply:
考虑c * a^b,变量c为1;当然以下是有效的:
a^0=1a^1=aa^b b>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,现在乘以a。 c=c*a;
如果你记得c * a^b,你可以将b减少1,因为一个a在c中 现在继续上面的偶数... ... 每当你有一个不均匀的指数时,让c累积因子得到一个偶数b。
如果b最终为1,则c*a是您的最终结果(每次c*a}:如果没有不均匀的b,则c仍为1)

案例2
带有负b的a^b(不是很自然)
这很简单:a^(-b) = 1/(a^b)是一个基本的数学规则 IE浏览器。忽略b首先是负数,但取结果的倒数。

案例3
通用实数。
好吧,在理论a^b = e^(b*ln(a))
Exp
Log
其中只有自然指数,所以......

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

Math.pow等方法的实际实现是适用于某些CPU类型的高度专业化算法,因此实际的错误数字错误保持尽可能小。此外,它应该也很快,这使得整个事情在代码方面变得更加复杂。了解它的外观:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要了解它的工作原理,需要相当多的数学和技术知识 如果你没有充分的理由,花点时间的其他东西可能会更有趣:)