Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么这样实现log_sum更有效?_C_Math_Optimization_Numerical Methods_Logarithm - Fatal编程技术网

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

C 为什么这样实现log_sum更有效?,c,math,optimization,numerical-methods,logarithm,C,Math,Optimization,Numerical Methods,Logarithm,根据这条线索: 有时log_sum的实现方式如下: log(a+b)=log(a*(1+b/a))=log a+log(1+b/a) 我不明白为什么这种方法更有效。。有人对此有想法吗?当a是常数时(至少对于某些b值),以及b

根据这条线索:

有时log_sum的实现方式如下:

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


我不明白为什么这种方法更有效。。有人对此有想法吗?

a
是常数时(至少对于某些
b
值),以及
b<扩展速度快且精度高(
log1p
函数在某些数学库中),这种方法可能有用。

a
是常数时,这种方法可能有用(至少对于一些
b
值)和
b<扩展速度快且精度高(
log1p
函数在一些数学库中,)

我见过这种事情的一个地方是在处理高维空间上的概率或似然性时

p1 + p2 + ..
然而,这样的概率往往太小,无法用双倍来表示,所以我们通常用概率的对数来代替

log( exp(l1) + exp( l2) + ..)
其中l是p1等的对数。 问题是,如果只对表达式求值,很可能得到0,然后表达式变得不确定。但是你提到的技巧是为了解围,我们可以求值

l1 + log( 1 + exp(l2-l1) + ...)
这将合理地评估(至少如果l1是l中最大的)


因此,这不是效率的问题,而是绕开有限的双倍精度。

我见过这种情况的一个地方是在处理高维空间的概率或可能性时。人们有时想计算这样的和

p1 + p2 + ..
然而,这样的概率往往太小,无法用双倍来表示,所以我们通常用概率的对数来代替

log( exp(l1) + exp( l2) + ..)
其中l是p1等的对数。 问题是,如果只对表达式求值,很可能得到0,然后表达式变得不确定。但是你提到的技巧是为了解围,我们可以求值

l1 + log( 1 + exp(l2-l1) + ...)
这将合理地评估(至少如果l1是l中最大的)


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

与什么备选方案相反?它不是,在相反的方向上(在尖锐的回答中没有提到)。与什么备选方案相反?它不是,在相反的方向上(在尖锐的回答中没有提到)。