完全存储大整数

aar*_*thi 5 algorithm precision r floating-point-precision

在R软件中

a <- 123456789123456789123456789
sprintf("%27f",a)
#[1] "123456789123456791337762816.000000"
Run Code Online (Sandbox Code Playgroud)

我得到了错误的答案.我想要确切的a价值.

为什么系统显示错误的值a

jos*_*ber 10

你没有得到确切值的原因a是R将它存储为double而不是整数.因为a非常大,所以在分配时会发生一些舍入a.

通常将事物存储为整数,您将L在数字的末尾使用; 就像是:

a <- 12L
class(a)
# [1] "integer"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

数值数学CRAN任务视图的"多精度算术和符号数学"子标题下可以获得多精度算术的其他选项.