如果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?
答案 0 :(得分:5)
案例1 :
a^b
具有自然b(即a int
- 类型,^表示功率不是XOR):
正如你所说,它可以通过简单的重复乘法来解决。但是考虑更有效的方法,如square和multiply:
考虑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,现在乘以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))
和
其中只有自然指数,所以......
实际上,效率低且存在问题:计算机的小数精度有限,在计算过程中需要比实际结果更精确。如果你想要20个精确的十进制数字,你需要用例如精确计算。 30(或一些其他数字> 20)。其他方式:如果您使用CPU能够计算的所有内容进行计算,结果将不那么准确(最后一些错误的数字)。如果你正在编写一些bignum lib,你可能会为较小的预期结果分配一个大数据类型,但这不适用于内置的CPU类型。
Math.pow
等方法的实际实现是适用于某些CPU类型的高度专业化算法,因此实际的错误数字错误保持尽可能小。此外,它应该也很快,这使得整个事情在代码方面变得更加复杂。了解它的外观:
http://opensource.apple.com/source/Libm/Libm-2026/Source/Intel/expf_logf_powf.c
要了解它的工作原理,需要相当多的数学和技术知识
如果你没有充分的理由,花点时间的其他东西可能会更有趣:)