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

Avoid round off error in exponential calculation

由于舍入误差无法得到两个数字之间的比率: Ratio=exp(x)/(exp(x)+exp(y)) 这样 x=-1.11e4y=-1.12e4。 有什么数学或计算技巧可以做吗?

log-space...

中的一些数学运算怎么样
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)).

转换回正常的 space

如果还是不行,你实际上可以taylor expand the last line:

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

对于小 z,在这种情况下 z = exp(y-x)

你可以这样简化它:

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 得出的结果相同,但没有进入日志域并再次返回。)