带小数指数的算术平均值
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)
,但是 a
、b
和 c
太低以至于 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
等于 a
、b
或 c
之一,因此 exp
参数之一为 0,其余至多为 0。这样,exp
输出其中一个为1,其余最多为1。我们不用担心上溢或下溢;虽然下溢可能仍会在一个或多个 exp
调用中发生,但它不再是问题,因为 log
参数不会为 0。
由于舍入误差,无法计算三个数字的平均值:
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)
,但是 a
、b
和 c
太低以至于 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
等于 a
、b
或 c
之一,因此 exp
参数之一为 0,其余至多为 0。这样,exp
输出其中一个为1,其余最多为1。我们不用担心上溢或下溢;虽然下溢可能仍会在一个或多个 exp
调用中发生,但它不再是问题,因为 log
参数不会为 0。