我想了解更多關於在R上的精度計算例如之間會differenciateR沒有做1E + 20位操作
-1128347132904321674821 < -1128347132904321674822
-1128347132904321674821 > -1128347132904321674822
-1128347132904321674821 == -1128347132904321674822
但是前兩個答案是FALSE
第三是TRUE
我只是想知道如何包括點
我想了解更多關於在R上的精度計算例如之間會differenciateR沒有做1E + 20位操作
-1128347132904321674821 < -1128347132904321674822
-1128347132904321674821 > -1128347132904321674822
-1128347132904321674821 == -1128347132904321674822
但是前兩個答案是FALSE
第三是TRUE
我只是想知道如何包括點
當鍵入的整數比的最大整數大小(這可以通過鍵入.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
所有的數字。如果你需要大量的數字的準確性,使用任一gmp
或Rmpfr
(或兩者:-))。
但要確保這就是你需要的是什麼,而不是一般的浮點運算精度的限制。
gmp做我需要的,歡呼! 我不是有意超越這個數字,所以我不認爲我會需要Rmpfr。比你的幫助! –
那麼可能必須使用大量的算術包,如Rmpfr。我相信R使用64位雙打來表示這些大的整數,它給你大約16-17個有效數字。 –
確保你也在'R 3.x'上。 –