2013-03-12 53 views
3

從「http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-the7.31爲什麼[R把大量的,因爲即使

我們已經知道,大量(超過2^53)可以通過模塊化的操作使錯誤。

不過,我不明白爲什麼所有的大量被視爲連(我從未見過的大整數這是超過2^53的「奇」),即使我採取了一些錯誤的近似

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

錯誤消息(模量精度的可能性完全喪失)可以忽略不計

等。

都沒有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 

回答

8

IEEE double precision value有53位尾數。任何需要超過53個二進制數字精度的數字將被舍入,即從54開始的數字將隱含地設置爲零。因此,任何數量大於2^53的數字都必須是偶數(因爲其整數表示的最低有效位超出了浮點精度,因此爲零)。

+0

上帝保存NPE。謝謝!!! – Choijaeyoung 2013-03-12 19:19:34

+0

你說從54開始的數字將被隱式設置爲零。 >打印(2^54,22) [1] 18014398509481984.00000 >打印(2^54 + 1,22) [1] 18014398509481984.00000 >打印(2^54 + 2,22) [1] 18014398509481984.00000 > print(2^54 + 3,22) [1] 18014398509481988.0000 與上面一樣,R不認爲它們爲零 – Choijaeyoung 2013-03-12 19:35:54

+0

@Choijaeyoung:我不明白你最後的評論。你顯示的數字全部被4整除,這意味着兩個最低有效位是零。 – NPE 2013-03-12 19:38:56

2

有沒有這樣的事,作爲一個「整數」中的R版本的或更早版本v2.15.3,其大小是大於2^31-1。您正在使用「數字」或「雙」實體。你可能「捨不得」或者說你的價值觀。

?`%%` 

的即將是但尚未發行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 

所以,你的第一個例子可以重新運行正確的結果,但你的第二個例子可能仍會失敗。

+0

謝謝指示 – Choijaeyoung 2013-03-12 19:23:40