带小数指数的算术平均值

Arithmetic Mean with exponent of small numbers

由于舍入误差,无法计算三个数字的平均值:

a=-1.11e4 
b=-1.12e4
c=-1.13e4
Mean=1/3 *[exp(a)+exp(b)+exp(c)]

如何获取日志值中的结果?

您试图找到 log((exp(a) + exp(b) + exp(c)) / 3),但是 abc 太低以至于 exp 的结果下溢到0. 您可以通过调整值来解决此问题,这样 exp 就不会下溢。

d = max(a, b, c)。那么我们有以下等式:

M = log((exp(a) + exp(b) + exp(c)) / 3)
  = log(exp(d) * (exp(a-d) + exp(b-d) + exp(c-d)) / 3)
  = log(exp(d)) + log((exp(a-d) + exp(b-d) + exp(c-d)) / 3)
  = d + log((exp(a-d) + exp(b-d) + exp(c-d)) / 3)

所以我们可以计算结果为d + log((exp(a-d) + exp(b-d) + exp(c-d)) / 3)。由于 d 等于 abc 之一,因此 exp 参数之一为 0,其余至多为 0。这样,exp输出其中一个为1,其余最多为1。我们不用担心上溢或下溢;虽然下溢可能仍会在一个或多个 exp 调用中发生,但它不再是问题,因为 log 参数不会为 0。