2015-02-24 115 views
1

的錯誤數我跑中的R版本3.1.2以下代碼:↑76函數返回元素

> 7 - (.05+.1)/.05 
[1] 4 
> rep(NA, 4) 
[1] NA NA NA NA 
> rep(NA, 7 - (.05+.1)/.05) 
[1] NA NA NA 

注意最後rep調用返回3次來港定居,而不是4,即便7 - (.05+.1)/.05 = 4。其他人是否可以複製同樣的錯誤?有沒有簡單的解釋呢?

+2

'(7 - (0.05 + 0.1) /.05)== 4#[1] FALSE'和'rep(NA,3.9)#[1] NA NA NA' – akrun 2015-02-24 17:18:50

+3

這是R常見問題7.31:http://stackoverflow.com/search?q=[r ] + faq + 7.31 – 2015-02-24 17:20:50

+1

試試'sprintf(「%。30f」,7 - (.05 + .1)/。05)'。正如你可以看到它不是4但是3.9999999 ...所以當'rep'在內部調用'as.integer(3.99999)'時它得到3 ... – digEmAll 2015-02-24 17:21:59

回答

2

7.31爲什麼R不認爲這些數字是相等的?

只能用R的數字類型表示的唯一數字是整數和分母是2的冪的分數。其他數字必須四捨五入爲(典型值)53個二進制數字精度。結果,兩個浮點數不可靠地相等,除非它們已經通過相同的算法計算出來,並且不總是那樣。例如,

R> a <- sqrt(2) 
R> a * a == 2 
[1] FALSE 
R> a * a - 2 
[1] 4.440892e-16 

函數all.equal()使用.Machine $ double.eps^0.5的數值容差比較兩個對象。如果你想要比這更精確的話,你需要仔細考慮錯誤傳播。

如果您期望的結果是一個整數,你可以通過使用round功能,迫使它是一個完美的一個:

7L - (.05+.1)/.05 == 4 
[1] FALSE 

round(7L - (.05+.1)/.05) == 4 
[1] TRUE