我们说我有log_a1 = -1000,log_a2 = -1001和log_a3 = -1002。 n = 3
我想获得a1,a2和a3(不是log_a1,log_a2和log_a3)的调和平均值(HM),使得HM = n / [1 / exp(log_a1)+ 1 / exp(log_a2)+ 1 / EXP(log_a3)]。
然而,由于舍入误差exp(log_a1)= exp(-1000)= 0并且因此1 / exp(log_a)= inf且HM = 0。
有什么数学技巧要做吗?可以获得HM或log(HM)。
答案 0 :(得分:2)
最好的方法可能是保持对数比例。许多科学语言都有 log-add-exp 函数(例如python中的numpy.logaddexp
),它以高精度执行你想要的输入和结果的日志形式。
您的想法是想要计算e^-1000 + e^-1001 + e^-1002
,因此您将其计算为e^-1000 (1 + + e^-1 + e^-2)
并获取日志。结果是-1000 + log(1 + e^-1 + e^-2)
,可以在不损失精度的情况下计算。
答案 1 :(得分:0)
log(HM)= log(n)-log(1)+ log_a_max - log(sum(1./exp(log_ai - log_a_max)))
对于a = [ - 1000,-1001,-1002];
日志(HM)= - 1001.309