私が入力した場合:
x<-seq(0,20,.05)
x[30]
x[30]==1.45
False
コードの最後の行からを取得するのはなぜですか? ここで何が間違っていましたか?
この質問は、さまざまな形式ではありますが、100 万回も尋ねられています。これは、浮動小数点の不正確さが原因です。また、追いつきたいかもしれない浮動小数点エラーに関する別のリンクもここにあります!
これを試して、最初に何が起こっているかを確認してください。
x <- seq(0, 20, 0.5)
sprintf("%.20f", x[30]) # convert value to string with 20 decimal places
# [1] "14.50000000000000000000"
x[30] == 14.5
# [1] TRUE
これまでのところ、すべて順調です。今、これを試してください:
x <- seq(0, 20, 0.05)
sprintf("%.20f", x[30]) # convert value to string with 20 decimal places
# [1] "1.45000000000000017764"
x[30] == 1.45
# [1] FALSE
マシンがこの数値を特定の桁までしか正確に表現できないことがわかります。ここでは、最大 15 桁程度です。したがって、結果を直接比較すると、もちろん FALSE になります。代わりに、に等しい許容誤差all.equal
のパラメーターを持つ whichを使用することができます。私のマシンでは、これは と評価されます。 これは、数値との絶対差がこのしきい値よりも小さい場合、これを TRUE と評価することを意味します。.Machine$double.eps ^ 0.5
1.490116e-08
x[30]
1.45...
all.equal
all.equal(x[30], 1.45)
[1] TRUE
これを行う別の方法は、特定のしきい値で明示的にチェックすることです(@eddiの回答が示すように)。
これは、これらが であるという事実と関係があり、任意の言語でdouble
を比較する正しい方法は、次のようにすることです。double
abs(x[30] - 1.45) < 1e-8 # or whatever precision you think is appropriate