2013-10-11 78 views
2

我想了解更多關於在R上的精度計算例如之間會differenciateR沒有做1E + 20位操作

-1128347132904321674821 < -1128347132904321674822 
-1128347132904321674821 > -1128347132904321674822 
-1128347132904321674821 == -1128347132904321674822 

但是前兩個答案是FALSE第三是TRUE

我只是想知道如何包括點

+0

那麼可能必須使用大量的算術包,如Rmpfr。我相信R使用64位雙打來表示這些大的整數,它給你大約16-17個有效數字。 –

+0

確保你也在'R 3.x'上。 –

回答

4

當鍵入的整數比的最大整數大小(這可以通過鍵入.Machine$integer.max找到)放大時,則R它強制轉換爲雙精度。而且,只有(略小於)2^64個唯一的雙值。 2^64約爲1.84 * 10^19,而您輸入的數字約爲10^21。但是,double的所有64位都不是精確位。其中一個是符號位,其中11個是尾數(即指數位)。所以你只能得到52位的精度,這可以轉換成15或16位的小數位數。你可以在R中測試這個:

> for(i in 10:20) 
    cat(i,10^i == 10^i+1,"\n") 
10 FALSE 
11 FALSE 
12 FALSE 
13 FALSE 
14 FALSE 
15 FALSE 
16 TRUE 
17 TRUE 
18 TRUE 
19 TRUE 
20 TRUE 

所以你看到,大約15位數後,雙精度提供的精度已經耗盡。可以在R中執行更高精度的算術,但是您需要加載一個提供此功能的庫。一個這樣的庫是gmp

> library(gmp) 
> x<-as.bigz("-1128347132904321674821") 
> y<-as.bigz("-1128347132904321674822") 
> x<y 
[1] FALSE 
> x>y 
[1] TRUE 
> x==y 
[1] FALSE 
> x==y+1 
[1] TRUE 
3

所有的數字。如果你需要大量的數字的準確性,使用任一gmpRmpfr(或兩者:-))。

但要確保這就是你需要的是什麼,而不是一般的浮點運算精度的限制。

+0

gmp做我需要的,歡呼! 我不是有意超越這個數字,所以我不認爲我會需要Rmpfr。比你的幫助! –