处理非常大的数字的对数
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
一些常量 a
、b
和向量 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
最后一项只是因子,不是对数。对不起。
我做了一个程序,它必须输出一个包含函数值的文件。这个函数产生非常大的值,但我只需要对数,它可以达到大约 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
一些常量 a
、b
和向量 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
最后一项只是因子,不是对数。对不起。