2012-07-31 43 views
4

我遇到了函數seq的某種奇怪的(或者僅僅是沒有預期的)行爲。 創建簡單序列時,某些值無法與==運算符正確匹配。 看到這個小例子:seq和==運算符的神祕行爲。一個精確的問題?

my.seq <- seq(0, 0.4, len = 5) 
table(my.seq)     # ok! returns 0 0.1 0.2 0.3 0.4 
           #    1 1 1 1 1 

which(my.seq == 0.2)   # ok! returns 3 
which(my.seq == 0.3)   # !!! returns integer(0) 

當手動創建我的序列,它似乎工作,雖然:

my.seq2 <- c(0.00, 0.10, 0.20, 0.30, 0.40) 

which(my.seq2 == 0.3)   # ok! returns 4 

你有任何的解釋?我通過使用which(round(my.seq, 2) == 0.3)解決了這個問題,但我會對導致問題的原因感興趣。

預先感謝您的意見。

+1

請參閱'?'==''的文檔,特別是標題爲「注意」的部分。 – joran 2012-07-31 14:43:44

+0

謝謝。我只是沒有意識到在這種簡單的情況下可能會有任何問題,但是'seq'會做一些計算,所以就是這樣。那麼,下一次使用'round'時我一定會更加小心嗎? (我的意思是將'isTRUE(all.equal(x,0.3))'應用到序列中會有點矯枉過正,不是嗎?) – Stefan 2012-07-31 15:15:16

+1

是否過度殺毒取決於你有多少錯誤在你的代碼中確定。 – joran 2012-07-31 16:37:44

回答

3

計算機只是不能很好地表示浮點數。電子表格隱藏這種趨勢的一般趨勢是,大多數人在計算機上處​​理數字的主要方式導致了許多問題。

決不對陣精確浮點值。 R中有處理這個問題的函數(例如all.equal),但我更喜歡以下內容。

假設你有一個未知的浮點變量A,你想知道它是否等於0.5。

abs(A - 0.5) < tol 

將容差設置爲您接近0.5的距離。例如,tol <- 0.0001可能適合您。

如果你的值看起來像是它們應該是整數。或者,如果您知道要測試的小數位數,則可以舍入到小數位數。

+0

謝謝。現在我知道這個問題了,我想,我會按照你的建議。 – Stefan 2012-07-31 15:19:58

+0

all.equal使用的默認容差是sqrt(.Machine $ double。eps)'或者'1.490116e-08'。因此,要複製'all.equal'的結果,可以使用@ John的方法作爲容差。 – Noah 2016-12-12 03:51:32

2

計算機有一個艱難的時間,存儲精確值。

> options(digits=22) 
> seq(0, .4, len = 5) 
[1] 0.0000000000000000000000 0.1000000000000000055511 0.2000000000000000111022 
[4] 0.3000000000000000444089 0.4000000000000000222045 
> .4 
[1] 0.4000000000000000222045 
> c(0, .1, .2, .3, .4) 
[1] 0.0000000000000000000000 0.1000000000000000055511 0.2000000000000000111022 
[4] 0.2999999999999999888978 0.4000000000000000222045 

由於我們使用的是二進制浮點表示,我們無法準確表示感興趣的值。它看起來是因爲.4的值比0.4高一點,.3的值比你自己輸入.3的值稍高。我相信別人會爲此提供更好的解釋,但希望這可以解釋這個問題。

+0

是的,它的確如此。謝謝。我懷疑是這樣的問題。那麼你建議什麼?永遠不要與精確值相匹配,總是在比較之前舍入? – Stefan 2012-07-31 14:52:37

+2

不要自己四捨五入。看看喬蘭的評論是指向你。我相信這會在某些時候引導你「all.equal」。 – Dason 2012-07-31 15:00:44

+0

It dit。但是在這個簡單的例子中,我認爲,我會堅持下去,或者像John(上面)所建議的那樣,用一些寬容的態度去做。 – Stefan 2012-07-31 15:18:21

2

這是FAQ 7.31,它也有一個鏈接到一般問題的更長的討論。

+0

感謝您的提示。 [FAQ 7.31](http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f) – Stefan 2012-07-31 16:06:26