R-小数值计算不正确



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

这是一个连续函数,但当在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)

绘制

由于浮点数的精度,您的公式出现了一种现象。当您将小值添加到大数字中时,总是存在精度丢失的风险。

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包(例如,请参见此处)。另一个解决方案是找到一种避免+1exp(-x) + exp(x)的替代形式。

需要注意的是,这不是R中的缺陷,而是浮点运算的一般问题。

创建于2021-03-10由reprex包(v1.0.0)

最新更新