我在R中遇到一个问题,当它对大数字执行简单算术时不正确。有人可以解释发生了什么,以及如何解决?
> a <- 51569
> b <- a + 6924851946518374722
> b
[1] 6924851946518425600 # problem is visible here already
> c <- b - 6924851946518374722
> c
[1] 51200
添加大号时会出现469的错误。为什么呢?
答案 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多精度库:
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