我做了一个程序,必须输出一个带有函数值的文件。这个函数产生非常大的值,但我只需要对数,它可以达到大约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
对于某些常量a
,b
和向量g[]
。那只是伪代码,我写每个x [1],x [2]。
是否有任何技巧可以计算出该总和的对数而不会遇到NaN
问题?
非常感谢
PS:我正在使用python因为我所说的,如果有任何特殊的C(++)库或类似的东西来处理非常大的数字,我会非常感激。 PS:b
中的常数cosh
可能大约为100,而且可能会让事情爆炸,所以如果有什么事情可以以某种方式取出那个常数...
答案 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
最后一个词只是因素,而不是它的日志。遗憾。