我在处理大数字时遇到问题。
我需要计算一个非常大的数字的日志。这个数字是一系列数字的乘积。例如:log(2x3x66x435x444)虽然我的实际系列更长。
我的数学溢出因为产品变得非常大,很快。
是否有特殊的数学库来处理庞大的数字?我有什么想法可以解决这个问题吗?
答案 0 :(得分:28)
这个问题有一个简洁的数学解决方案。
您可以使用其日志值,而不是通过将每个数字相乘来获得系列的乘积。提到的原则是:
log(a*b) = log(a) + log(b)
对于示例系列(2,3,66,435,444),蛮力产品计算为2 * 3 * 66 * 435 * 44 = 76,483,440。
但是,您也可以从日志总和中获取产品。对于一系列(n1,n2,n3,n4,...),该系列的产品是:10 ^(log(n1)+ log(n2)+ log(n3)+ log(n4)...)< / p>
log(2) = 0.30103
log(3) = 0.47712
log(66) = 1.8195
log(435) = 2.6384
log(444) = 2.6474
值的总和大致为7.8835。该系列的产品是10 ^ 7.8835(76,483,440)。
由于您正在查找该系列产品的日志,因此只需记录各个log()值的总和,即7.8835。就是这样。
答案 1 :(得分:19)
嗯:log(a * b)= log(a)+ log(b)
答案 2 :(得分:3)
使用Python;)
$python
Python 2.4.4 (#71, Oct 18 2006, 08:34:43) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.log(2*3*66*435*444)
18.15258480477539
>>>
答案 3 :(得分:1)
Java类BigInteger和BigDecimal可以提供帮助
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigInteger.html
http://java.sun.com/j2se/1.5.0/docs/api/java/math/BigDecimal.html