为什么像这样实现log_sum更有效?

时间:2016-11-20 07:17:36

标签: c math optimization numerical-methods logarithm

根据这个帖子:To Compute log(a+b)

有时log_sum的实现方式如下:

log(a + b) = log(a * (1 + b/a)) = log a + log(1 + b/a)

我很困惑为什么这种方法更有效率。有没有人对此有想法?

2 个答案:

答案 0 :(得分:3)

a为常量(至少对于某些b值)和b<<a(明显更小)时,此方法可能很有用。在这种情况下,log(1 + b/a)可以通过Taylor series扩展快速计算并具有良好的精度(log1p函数在某些数学库中another method

答案 1 :(得分:2)

在我看到这种事情的一个地方是处理高维空间的概率或可能性。人们有时想要计算总和,如

p1 + p2 + ..

然而,这些概率通常太小而无法用双精度表示,因此人们常常使用概率的对数来处理。然后我们要计算

log( exp(l1) + exp( l2) + ..)

其中l是p1等的日志 问题是,如果只是评估exps,那么很可能得到0,然后表达式变得不确定。但是你提到的诀窍是救援,我们可以评估

l1 + log( 1 + exp(l2-l1) + ...)

这将合理地评估(至少l1是l中最大的)。

所以这不是效率的问题,而是绕过双打的有限精度。