2013-03-25 81 views
0

我將使用以下代碼在R中生成一個從0.01.0的矢量v
但是,v僅限於0.99R中的循環問題

> s <- 0.0; v <- numeric(); 
> while (s <= 1){ 
+ v <- append(v, s) 
+ s <- s + 0.01 
+ } 
> v 
    [1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 
[16] 0.15 0.16 0.17 0.18 0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 
[31] 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 
[46] 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 
[61] 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 
[76] 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 
[91] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 
> 

所以我看看s和while循環中的邏輯。
我發現了一些謎...

> s <= 1 
[1] FALSE 
> s == 1 
[1] FALSE 
> s 
[1] 1 

假設s1.01,但只去1 ...
因此,我們知道s1,但爲什麼它不等於1

(我是新來的R,對不起,問愚蠢的問題。)

+0

原因單曲<= 1'和單曲== 1'失敗是由於浮點錯誤。 – Justin 2013-03-25 20:43:13

+1

瀏覽常見問題通常是值得的時間投資:http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f – 2013-03-25 20:46:39

回答

2

爲什麼不使用內置的一個R函數seq

> seq(0,1,.01) 
    [1] 0.00 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 
[16] 0.15 0.16 0.17 0.18 0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 
[31] 0.30 0.31 0.32 0.33 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 
[46] 0.45 0.46 0.47 0.48 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 
[61] 0.60 0.61 0.62 0.63 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 
[76] 0.75 0.76 0.77 0.78 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 
[91] 0.90 0.91 0.92 0.93 0.94 0.95 0.96 0.97 0.98 0.99 1.00 

FALSEs<= 1的原因是因爲你想爲一個整數比較浮點數。浮點數是inherentlyimprecise,並且會使等式比較困難。

在您的具體情況下,將最終的.01添加到s會使其超過1,導致您的循環在預期之前終止一次迭代。

這是它的使用的r內置函數這樣的事情一個很好的習慣,因爲他們會處理極端案例以你的原因之一(也將是在大多數情況下更快。)

+0

因爲我不完全熟悉R,所以我自己創建它:P – 2013-03-25 20:43:13

+1

閱讀「R介紹」(http://cran.r-project.org/doc/manuals/R-intro.html)可能會幫助你。儘管如此,絕對使用'seq'。 – Wilduck 2013-03-25 20:44:28

+0

但是,你能解釋爲什麼'<= 1'是'FALSE'? – 2013-03-25 20:44:43

1

當您嘗試將浮點值與非常精確的小數進行比較時,經常會發生此現象。

就你而言,你嘗試比較1,實際上它比1大一點。因此,當您嘗試與s < = 1進行比較時,始終爲false。

See more information of floating point errors here