3

来自“ http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-the7.31

我们已经知道大数(超过 2^53)在模运算中会出错。

但是,我无法理解为什么所有大数都被视为偶数(我从未见过超过 2^53 的大整数的“奇数”),即使我在近似值上有一些错误

(2^53+1)%%2
(2^100-1)%%2

可以忽略错误消息(模数精度可能完全丧失)

ETC..

都不是 1 而是 0

为什么这样?(我知道有一些近似值,但我需要具体知道原因)

> print(2^54,22)
[1] 18014398509481984.00000 
> print(2^54+1,22)
[1] 18014398509481984.00000 
> print(2^54+2,22) 
[1] 18014398509481984.00000 
> print(2^54+3,22) 
[1] 18014398509481988.0000
4

2 回答 2

8

IEEE 双精度值具有53 位尾数。任何需要超过 53 位精度的二进制数字都将被舍入,即从 54 开始的数字将被隐式设置为零。因此,幅度大于 2^53 的任何数字都必然是偶数(因为其整数表示的最低有效位超出了浮点精度,因此为零)。

于 2013-03-12T19:17:07.070 回答
2

在 v2.15.3 或更早版本的 R 版本中没有“整数”之类的东西,其幅度大于 2^31-1。您正在使用“数字”或“双”实体。您可能正在“四舍五入”或trunc破坏您的价值观。

 ?`%%`  

即将发布但尚未发布的 R 版本 3.0 将具有 8 个字节整数,并且在超出 2^2^((8*8)-1))-1 之前不会出现此问题。目前强制转换为整数在该级别失败:

> as.integer(2^((8*4)-1)-1)
[1] 2147483647
> as.integer(2^((8*8)-1)-1)
[1] NA
Warning message:
NAs introduced by coercion 

因此,您的第一个示例可能会重新运行正确的结果,但您的第二个示例可能仍会失败。

于 2013-03-12T19:14:48.583 回答