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



平均值的偏差之和应该总是为0。然而,当平均值有很多数字时,可能是无限的,比如这个20/7,R无法计算它。

x <- c(1,2,2,3,3,4,5)
sum(x - mean(x))
[1] -4.440892e-16

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

您所描述的问题是所有编程语言的普遍问题。内部所有浮点数都基于IEEE754惯例。你可以在这里了解更多。

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

编辑:R已经使用了浮点数的双精度表示。要了解更多信息,您可以查看R FAQ和这个SO问题。

  • 如果您只处理有理数,例如您的示例,您可以使用gmp包。

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

  • 另一个可能是lazyNumbers包,在CRAN上最新发布:

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

最新更新