首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与非常大数的对数一起工作

与非常大数的对数一起工作
EN

Stack Overflow用户
提问于 2015-04-12 01:10:33
回答 2查看 1.6K关注 0票数 0

我已经完成了一个程序,它必须输出一个带有函数值的文件。这个函数产生非常大的值,但是我只需要对数,它可以上升到大约10000甚至一百万的值(大,但是用整数32位变量来管理)。

显然,函数本身将是exp(10000)的顺序,这是巨大的。所以我在寻找计算对数的任何技巧。我使用python,因为我认为它对非常大的数字的本地支持是有用的,但在非常大的数字的情况下不是这样。

该函数的值计算为:

代码语言:javascript
运行
AI代码解释
复制
a*(x1+x2+x3+x4)

我要取这个对数。我已经对所有因素的对数进行了预处理,然后把它们加起来,但是我不能用log(x1+x2+x3+x4)做任何事情(至少任何简单的事情)。

python的结果是因为x1、x2、x3、x4变量增长到了很多。它们的计算方法是:

代码语言:javascript
运行
AI代码解释
复制
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[]。这只是伪代码,我编写了每个x1、x2。

有什么技巧可以让我在不遇到NaN问题的情况下计算这个和的对数?

非常感谢

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

P.S.:bcosh中的常数可以是100级,而不是制造爆炸,所以如果有任何与取掉这个常数有关的事情.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-12 01:23:56

我看到,在你的循环中,你每次用常数a乘以每一个x,如果你跳过这个因子,然后取日志(x1+x2+x3+x4),这可能是可管理的,你只需将log(a)加到其中,得到最终的结果。或者n*log(a),如果你要乘以几次。

这个想法是独立于语言的。:-)

票数 1
EN

Stack Overflow用户

发布于 2015-04-12 02:06:04

放大这样的总结性:

代码语言:javascript
运行
AI代码解释
复制
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)  

编辑:呃-哦,一个细节是错误的:

代码语言:javascript
运行
AI代码解释
复制
result = log(a)*K + sum(log(x[i]) for i in range(1, K)) + scale_factor

最后一项只是因素,而不是日志。抱歉的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29587776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档