处理非常大的数字的对数

Work with logarithms of very large numbers

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

现在,很明显,函数本身将达到 exp(10000) 的数量级,而且数量巨大。所以我正在寻找任何计算对数的技巧。我正在使用 python,因为我认为它对非常大的数字的本机支持会很有用,但它不是在非常大的数字的情况下。

函数的值计算为:

a*(x1+x2+x3+x4)

我必须取它的对数。我已经对所有因素的对数进行了预处理,然后将它们全部相加,但是我不能用 log(x1+x2+x3+x4).

做任何事情(至少是简单的事情)

python 的结果为 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 问题中没有 运行 的情况下,是否有任何技巧可以计算该总和的对数?

非常感谢

P.S.: 我之所以使用 python 是因为我说过,如果有任何用于 C(++) 的特殊库或类似的库来处理非常大的数字,我会非常感谢。

P.S.: cosh 中的常量 b 可以是 100 的数量级,并且可以使事情爆炸,所以如果有什么关系的话不知何故不断……

我看到在你的循环中你每次都将每个 x 乘以一个常数 a。如果您跳过该因素,并采用可能易于管理的 log(x1+x2+x3+x4),则只需将 log(a) 添加到其中即可获得最终结果。或者 n*log(a) 如果你乘以几次。

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

像这样缩放加数:

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

最后一项只是因子,不是对数。对不起。