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)。另一种方法是找到一种替代形式,避免 +1
和 exp(-x) + exp(x)
.
请务必注意,这不是 R
中的缺陷,而是 general issue of floating point arithmetic。
由 reprex package (v1.0.0)
于 2021 年 3 月 10 日创建
我考虑以下函数:-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)。另一种方法是找到一种替代形式,避免 +1
和 exp(-x) + exp(x)
.
请务必注意,这不是 R
中的缺陷,而是 general issue of floating point arithmetic。
由 reprex package (v1.0.0)
于 2021 年 3 月 10 日创建