使用非常大数的对数

时间:2015-04-12 09:10:34

标签: python long-integer

我做了一个程序,必须输出一个带有函数值的文件。这个函数产生非常大的值,但我只需要对数,它可以达到大约10000或甚至一百万的值(大,但可以使用整数32位变量进行管理)。

现在,显然函数本身将是exp(10000)的顺序,并且这个数字很大。所以我正在寻找计算对数的任何技巧。我使用python是因为我认为它对非常大的数字的原生支持会很有用,但它并不适用于非常大的数字。

函数的值计算如下:

a*(x1+x2+x3+x4)

我必须采用对数。我已经预先处理了所有因子的对数,然后将它们全部加起来,但我无法用log(x1+x2+x3+x4)做任何事情(至少是任何简单的事情)。

python ar NaN的结果,因为x1,x2,x3,x4变量增长很多。它们计算如下:

x = [1,1,1,1]
for i in range(1,K):
    x[j] *= a*cosh(b*g[i]) # even values of i
    x[j] *= a*sinh(b*g[i]) # odd values of i

对于某些常量ab和向量g[]。那只是伪代码,我写每个x [1],x [2]。

是否有任何技巧可以计算出该总和的对数而不会遇到NaN问题?

非常感谢

PS:我正在使用python因为我所说的,如果有任何特殊的C(++)库或类似的东西来处理非常大的数字,我会非常感激。

PS:b中的常数cosh可能大约为100,而且可能会让事情爆炸,所以如果有什么事情可以以某种方式取出那个常数...

2 个答案:

答案 0 :(得分:1)

我在你的循环中看到你每次将x乘以常数a。如果你跳过那个因素,然后选择可以管理的log(x1 + x2 + x3 + x4),你只需要在其中添加log(a)以获得最终结果。或者n * log(a)如果你再乘以几次。

这个想法与语言无关。 : - )

答案 1 :(得分:1)

缩放这样的加数:

x = []
scale_factor = max(b*g[i] for i in range(1, K))
for i in range(1, K):
    x[i] = cosh(b*g[i] - scale_factor)

result = log(a)*K + sum(log(x[i]) for i in range(1, K)) + log(scale_factor)  

修改: 呃哦,有一个细节错了:

result = log(a)*K + sum(log(x[i]) for i in range(1, K)) + scale_factor

最后一个词只是因素,而不是它的日志。遗憾。