避免指数计算中的舍入误差
Avoid round off error in exponential calculation
由于舍入误差无法得到两个数字之间的比率:
Ratio=exp(x)/(exp(x)+exp(y))
这样 x=-1.11e4
和 y=-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 得出的结果相同,但没有进入日志域并再次返回。)
由于舍入误差无法得到两个数字之间的比率:
Ratio=exp(x)/(exp(x)+exp(y))
这样 x=-1.11e4
和 y=-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))
.
如果还是不行,你实际上可以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 得出的结果相同,但没有进入日志域并再次返回。)