Rounding Error: Harmonic mean with exponent of small numbers
Rounding Error: Harmonic mean with exponent of small numbers
假设我有 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)。
最好的方法可能是保持对数尺度。许多科学语言都有一个 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)
,可以不损失精度地计算出来。
log(HM)=log(n)-log(1)+log_a_max - log(sum(1./exp(log_ai - log_a_max)))
对于 a=[-1000, -1001, -1002];
log(HM)=-1001.309
假设我有 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)。
最好的方法可能是保持对数尺度。许多科学语言都有一个 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)
,可以不损失精度地计算出来。
log(HM)=log(n)-log(1)+log_a_max - log(sum(1./exp(log_ai - log_a_max)))
对于 a=[-1000, -1001, -1002];
log(HM)=-1001.309