-1

forループを使用して前方または後方に検索している場合、配列内の特定の要素を検索しているときに異なる答えが得られます。

例: 正解を返すコード

vg   = rep(seq(0.9,1.1,0.01),90)
vals = seq(0.9,1.05,0.01)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

このコードは、0.9:90 0.91:90 0.92:90 0.93:90 0.94:90 0.95:90 0.96:90 0.97:90 0.98:90 0.99:90 1:90 1.01:90 1.02:90 1.03:90 1.04:90 1.05 :90

どちらが正しい。しかし、以下のコードを使用して上記の vg 変数の seq を変更すると:

vg   = rep(seq(1.1,0.9,-0.01),90)
vals = seq(0.9,1.05,0.01)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

以下に示す答えが得られます.0.96、0.97などの検索中に0個の要素が表示されます.

0.9:0 0.91:0 0.92:0 0.93:90 0.94:90 0.95:90 0.96:0 0.97:0 0.98:0 0.99:0 1:90 1.01:90 1.02:90 1.03:90 1.04:90 1.05:90:90:90

両方のコードでまったく同じ要素を検索しているのに、なぜこの不一致が生じるのでしょうか? これはRバグですか?

4

1 に答える 1

4

Andrie のコメントを拡張すると、これ浮動小数点の問題です。良書『The R Inferno 』からの引用

アケロン川を渡ると、高潔な異教徒の本拠地である最初のサークルに到着しました。これらは、浮動小数点の神々を知らずに生きている人々です。これらの異教徒は次のことを期待しています。

.1 == .3 / 3
[1] FALSE  

真であります。高潔な異教徒は次のことも期待します。

seq(0, 1, by=.1) == .3
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

真の値が 1 つだけあること。

あなたの例では、代わりに浮動小数点数ではなく整数を使用すると、次のように機能します。

vg   = rep(seq(90,110,1),90)
vals = seq(90,105,1)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}

vg   = rep(seq(110,90,-1),90)
vals = seq(90,105,1)

for(val in vals){
  idx = c()
  idx = which((vg) %in% (val))
  cat(val,":",length(idx),"\t")
}
90 : 90         91 : 90         92 : 90         93 : 90         94 : 90         95 : 90         96 : 90  

R inferno は、実に楽しく有益な読み物です。強くお勧めします。

次のようにして、デフォルトで WYSINWYG を確認することもできます。

options(digits=22)
.3/3
[1] 0.09999999999999999167333
于 2013-03-07T10:38:24.567 に答える