避免指数计算中的舍入误差

时间:2015-11-17 16:04:55

标签: math rounding numerical exponential

由于舍入误差无法获得两个数字之间的比率: Ratio=exp(x)/(exp(x)+exp(y))x=-1.11e4y=-1.12e4。 任何数学或计算技巧?

2 个答案:

答案 0 :(得分:5)

您可以像这样简化:

R = exp(x) / (exp(x) + exp(y))
  = exp(x) / (exp(x) * (1 + exp(y) / exp(x)))
  =      1 / (1 + exp(y) / exp(x))
  =      1 / (1 + exp(y - x))

(这与DiltihiumMatrix导出的结果相同,但是无需进入日志域并再次返回即可获得。)

答案 1 :(得分:3)

如何在对数空间中进行数学操作......

R = exp(x)/[exp(x)+exp(y)]
log(R) = log[exp(x)] - log[exp(x)+exp(y)]
       = log[exp(x)] - log[exp(x)*(1+exp(y)/exp(x))]
       = log[exp(x)] - log[exp(x)*(1+exp(y-x)]
       = log[exp(x)] - log[exp(x)] - log[(1+exp(y-x))]
       = - log[(1+exp(y-x))]

现在,exp(y-x)应该是一个合理的数字,因此您可以轻松地计算出来。然后使用R = exp(log(R))转换回普通空间。

如果仍然不起作用,您实际上可以taylor expand the last line

log[(1+z)] ~ 1 + z^2/2 - z^3/3 ...

适用于小型z,在本例中为z = exp(y-x)