提问人:uke 提问时间:11/22/2022 更新时间:11/22/2022 访问量:55
R 中处理无限分数时的数学不精确
unprecise math in R when dealing with infinite fractions
问:
均值的偏差应始终相加为 0。 然而,当平均值有很多数字时,也许无限像这个 20/7 的数字,R 无法计算它。
x <- c(1,2,2,3,3,4,5)
sum(x - mean(x))
[1] -4.440892e-16
我是一个新手,到目前为止还没有找到任何关于这方面的信息,也许我没有搜索正确的术语。 是否可以在 R 中用无限长的数字进行计算? 我问这个问题是出于理论上的兴趣。
答:
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
评论