我已经完成了一个程序,它必须输出一个带有函数值的文件。这个函数产生非常大的值,但是我只需要对数,它可以上升到大约10000甚至一百万的值(大,但是用整数32位变量来管理)。
显然,函数本身将是exp(10000)
的顺序,这是巨大的。所以我在寻找计算对数的任何技巧。我使用python,因为我认为它对非常大的数字的本地支持是有用的,但在非常大的数字的情况下不是这样。
该函数的值计算为:
a*(x1+x2+x3+x4)
我要取这个对数。我已经对所有因素的对数进行了预处理,然后把它们加起来,但是我不能用log(x1+x2+x3+x4)
做任何事情(至少任何简单的事情)。
python的结果是因为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[]
。这只是伪代码,我编写了每个x1、x2。
有什么技巧可以让我在不遇到NaN
问题的情况下计算这个和的对数?
非常感谢
P.S.:我之所以使用python是因为我说过,如果有任何针对C(++)的特殊库或类似的东西来处理非常大的数字,我会非常感激的。
P.S.:b
在cosh
中的常数可以是100级,而不是制造爆炸,所以如果有任何与取掉这个常数有关的事情.
发布于 2015-04-12 01:23:56
我看到,在你的循环中,你每次用常数a乘以每一个x,如果你跳过这个因子,然后取日志(x1+x2+x3+x4),这可能是可管理的,你只需将log(a)加到其中,得到最终的结果。或者n*log(a),如果你要乘以几次。
这个想法是独立于语言的。:-)
发布于 2015-04-12 02:06:04
放大这样的总结性:
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
最后一项只是因素,而不是日志。抱歉的。
https://stackoverflow.com/questions/29587776
复制相似问题