R - 小值的计算不正确

R - Incorrect calculations for small values

我考虑以下函数:-x*exp(-x) - (1+exp(-x))*log(1+exp(-x))

它是一个连续函数,但是在 R 中绘制它时,我在 x 上得到一个从 -38 到 -34 的奇怪的不连续图(在计算中并没有低到 Inf/-Inf)。例如,x=-37.36 和 x=-37.38 的输出为 0,而 x=-37.37 的输出为 -128。这可能是什么原因?

我可能犯了一些非常基本的错误,但任何帮助都会非常有用。我已经添加了代码和情节。

谢谢!

x=seq(from=-38,to=-34,by=0.01)
kappa = -x*exp(-x) - (1+exp(-x))*log(1+exp(-x))

plot(x,kappa)

plot

由于浮点数的精度,您的公式存在一个现象。 当您将小值添加到大数时,总会有精度损失的风险。

x <- seq(from=-38, to=-0, by=1)
v1 <- exp(-x)
v2 <- 1 + v1
# The difference between `v1` and `v2` should be 1, however:
v1 - v2
#>  [1]  0  0 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
#> [26] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

一个简单的解决方案是使用提供更高精度浮点的包,例如 Rmpfr 包(参见 here)。另一种方法是找到一种替代形式,避免 +1exp(-x) + exp(x).

请务必注意,这不是 R 中的缺陷,而是 general issue of floating point arithmetic

reprex package (v1.0.0)

于 2021 年 3 月 10 日创建