我想计算log(exp(A1)+ exp(A2)) 下面的公式
log(exp(A1) + exp(A2) ) = log[exp(A1)(1 + exp(A2)/exp(A1))] = A1 + log(1+exp(A2-A1))
当A1和A2较大且数值为exp(A1)= Inf(或exp(A2)= Inf)时,是有用的。 (此公式在此主题中讨论 - > How to calculate log(sum of terms) from its component log-terms)。当A1和A2的角色被替换时,该公式为真。
我对这个公式的关注是A1和A2非常小。例如,当A1和A2为:
时 A1 <- -40000
A2 <- -45000
然后log(exp(A1)+ exp(A2))的直接计算是:
log(exp(A1) + exp(A2))
[1] -Inf
使用上面的公式给出:
A1 + log(1 + exp(A2-A1))
[1] -40000
这是A1的值。 将上面的公式与A1和A2的翻转角色一起给出:
A2 + log(1 + exp(A1-A2))
[1] Inf
三个值中哪一个最接近log的真值(exp(A1)+ exp(A2))?是否存在计算log(exp(A1)+ exp(A2))的稳健方法,当A1,A2较小且A1,A2较大时,可以使用该方法。
提前谢谢
答案 0 :(得分:1)
您应该使用更准确的东西来进行直接计算。
当[他们]很大时,它并不“有用”。当差异非常消极时,这很有用。
当x
接近0时,log(1+x)
约为x
。因此,如果A1>A2
,我们可以采用您的第一个公式:
log(exp(A1) + exp(A2)) = A1 + log(1+exp(A2-A1))
并按A1 + exp(A2-A1)
逼近(并且近似值会变得更好,因为A2-A1
更负面)。自A2-A1=-5000
以来,这足以使近似值足够。
无论如何,如果y
离零点太远(无论哪种方式),exp(y)
会(超过|)流动一个double并导致0或无穷大(这是一个双重的,对吗?什么语言你正在用吗?)。这解释了你的答案。但由于exp(A2-A1)=exp(-5000)
接近于零,因此您的答案约为-40000+exp(-5000)
,与-40000
无法区分,因此一个是正确的。
答案 1 :(得分:1)
在如此巨大的指数差异中,你可以做到最安全,没有任意精度
Am = max(A1,A2)
log(exp(A1)+exp(A2)) -> log(exp(Am)) = Am
-40000+delta
如果您想使用第二个公式,那么所有分解为计算log(1+exp(A))
A
为正,那么结果远非真实的A
为否定则会截断为log(1)=0
,以便您获得与上面相同的结果<强> [注释] 强>
base^500
(+/-)2^(+/-128)
(+/-)2^(+/-1024)
[PS]如果你需要更高的精度而没有任意精度
number=a^b
*,/
很容易+,-
是一场噩梦,但即便如此,也可能会有一些方法/算法