0

次のコードを使用して、Rでvから0.0へのベクトルを生成します。 ただし、にのみ移動します。1.0
v0.99

> 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

sである必要があると想定されますが、それは...1.01にのみ適用されます。 したがって、はであることがわかりますが、なぜそれが等しくないのですか?1
s11

(私はRに不慣れです、ばかげた質問をしてすみません。)

4

2 に答える 2

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

あなたが得る理由FALSEはあなたs<= 1が整数を浮動小数点数と比較しようとしているからです。浮動小数点数は本質的に 不正確であり、等式の比較を困難にします。

特定のケースでは、ファイナル.01を追加sして1を少し超える程度にバンプし、予想よりも1回前にループを終了させました。

これは、Rの組み込み関数を使用するのが良い習慣である理由の一部です。これは、Rの組み込み関数がコーナーケースを処理するためです(ほとんどの場合、より高速になります)。

于 2013-03-25T20:41:36.853 に答える
1

この現象は、浮動小数点値を非常に正確な小数と比較しようとしたときに頻繁に発生します。

あなたの場合、1を比較しようとしますが、実際には1より少し大きいです。したがって、s <= 1と比較しようとすると、常にfalseになります。

浮動小数点エラーの詳細については、こちらをご覧ください

于 2013-03-25T20:44:09.970 に答える