R 中处理无限分数时的数学不精确

unprecise math in R when dealing with infinite fractions

提问人:uke 提问时间:11/22/2022 更新时间:11/22/2022 访问量:55

问:

均值的偏差应始终相加为 0。 然而,当平均值有很多数字时,也许无限像这个 20/7 的数字,R 无法计算它。

x <- c(1,2,2,3,3,4,5)
sum(x - mean(x))

[1] -4.440892e-16

我是一个新手,到目前为止还没有找到任何关于这方面的信息,也许我没有搜索正确的术语。 是否可以在 R 中用无限长的数字进行计算? 我问这个问题是出于理论上的兴趣。

r 精度 分数 无穷大

评论

1赞 user438383 11/22/2022
这回答了你的问题吗?浮点数学坏了吗?

答:

2赞 Marcello Zago 11/22/2022 #1

您描述的问题是所有编程语言的普遍问题。在内部,所有浮点数都基于 IEEE754 约定。你可以在这里阅读更多关于它的信息。

据我所知,除了使用更高精度的数字表示之外,没有简单的方法可以解决这些小错误。

编辑:R 已经使用了浮点数的双精度表示形式。要了解更多信息,您可以查看 R 常见问题解答 SO 问题。

2赞 Stéphane Laurent 11/22/2022 #2
  • 如果只处理有理数,例如您的示例,则可以使用 gmp 包。

  • 您可以使用 Rmpfr 包来处理具有任意精度(必须设置)的数字。

  • 另一种可能性是在 CRAN 上新发布的 lazyNumbers 包:

library(lazyNumbers)

# create a vector of lazy numbers
x <- lazyvec(c(1, 2, 2, 3, 3, 4, 5))
# compute its mean
m <- sum(x) / length(x)
# sum expected to be 0
y <- sum(x - m)
# convert it to double
as.double(y)
## 0