1

私が入力した場合:

x<-seq(0,20,.05)
x[30]
x[30]==1.45

Falseコードの最後の行からを取得するのはなぜですか? ここで何が間違っていましたか?

4

2 に答える 2

5

この質問は、さまざまな形式ではありますが、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.51.490116e-08x[30]1.45...all.equal

all.equal(x[30], 1.45)
[1] TRUE

これを行う別の方法は、特定のしきい値で明示的にチェックすることです(@eddiの回答が示すように)。

于 2013-05-01T19:34:50.547 に答える
3

これは、これらが であるという事実と関係があり、任意の言語でdoubleを比較する正しい方法は、次のようにすることです。double

abs(x[30] - 1.45) < 1e-8   # or whatever precision you think is appropriate
于 2013-05-01T19:34:35.757 に答える