完全存储大整数

时间:2015-09-03 06:38:00

标签: r algorithm precision floating-point-precision

在R软件中

a <- 123456789123456789123456789
sprintf("%27f",a)
#[1] "123456789123456791337762816.000000"

我得错了答案。我想要精确的a值。

为什么系统显示错误的a

1 个答案:

答案 0 :(得分:9)

您未获得a的确切值的原因是R将其存储为double而不是整数。由于a非常大,因此在您指定a时会发生一些舍入。

通常将事物存储为整数,您可以在数字末尾使用L;类似的东西:

a <- 12L
class(a)
# [1] "integer"

但是,对于R中的标准整数,您的数字太大,并且您被迫使用双重表示:

a <- 123456789123456789123456789L
# Warning message:
# non-integer value 123456789123456789123456789L qualified with L; using numeric value 
class(a)
# [1] "numeric"

您需要多个精度来精确存储这么大的整数。一个选项是gmp包:

library(gmp)
a<-as.bigz("123456789123456789123456789")
a
# Big Integer ('bigz') :
# [1] 123456789123456789123456789

多精度算术的其他选项可在&#34;多精度算术和符号数学&#34; numerical mathematics CRAN task view

的副标题