R:大数字的算术错误

时间:2014-05-12 03:21:43

标签: r biginteger

我在R中遇到一个问题,当它对大数字执行简单算术时不正确。有人可以解释发生了什么,以及如何解决?

> a <- 51569
> b <- a + 6924851946518374722
> b
[1] 6924851946518425600 # problem is visible here already
> c <- b - 6924851946518374722
> c
[1] 51200

添加大号时会出现469的错误。为什么呢?

2 个答案:

答案 0 :(得分:4)

R使用双精度浮点表示值。精度取决于您的机器。在具有IEEE双精度的英特尔机器上,我得到52位精度:

> options(digits=22)
> (0:1) + 2^52
[1] 4503599627370496 4503599627370497
> (0:1) + 2^53
[1] 9007199254740992 9007199254740992

答案 1 :(得分:2)

R有一个包裹GMP的包,gnu多精度库:

CRAN: R gmp manual

library(gmp)
a <- as.bigz("51569")
b <- a + as.bigz("6924851946518374722")
c <- b - as.bigz("6924851946518374722")
c

Big Integer ('bigz') :
[1] 51569

正如评论中指出的,报价是必要的。

as.bigz(6924851946518374722) # Does not work as intended
Big Integer ('bigz') :
[1] 6924851946518374400

因为否则R会将参数转换为double,在转换为bigz之前会失去精度。

另请注意,R还不支持64位整数,例如

[1] 4294967296L
Warning message:
non-integer value 4294967296 qualified with L; using numeric value