The R Infernoを読んでいて、わからないことがありました。Inferno のセクション 8.2.23 に加えて、浮動小数点数の比較に関する良い質問がいくつかあります: question1、question2。
しかし、私はまだ使用中に問題が発生していall.equal
ます。デフォルトall.equal
を使用すると、(ほとんど)期待どおりの結果が得られます。
> all.equal(2,1.99999997)
[1] "Mean relative difference: 1.5e-08"
> all.equal(2,1.99999998) #I expected FALSE here
[1] TRUE
> all.equal(2,1.99999999)
[1] TRUE
1.99999998 で関数がTRUE
を返す理由はわかりませんが、許容レベルを指定した次の動作ほど問題ではありません。
> all.equal(2,1.98,tolerance=0.01) #Behaves as expected
[1] "Mean relative difference: 0.01"
> all.equal(2,1.981,tolerance=0.01) #Does not behave as expected
[1] TRUE
さらに、
> all.equal(2,1.980000000001,tolerance=0.01)
[1] TRUE
しかし、計算すると:
> diff(c(1.981,2))
[1] 0.019
そして明らかに、
> diff(c(1.981,2)) >= 0.01
[1] TRUE
では、なぜall.equal
公差 0.01 で 2 と 1.981 を区別できないのでしょうか?
編集
ドキュメントから: scale = NULL (デフォルト) の数値比較は、最初に 2 つの数値ベクトルの平均絶対差を計算することによって行われます。これが許容値よりも小さいか有限でない場合は、絶対差が使用されます。それ以外の場合は、相対差が平均絶対差でスケーリングされます。
ここでは、動作がわかりません。diff(1.981,2)
有限ではないことがわかります:
> sprintf("%.25f",diff(c(1.981,2)))
[1] "0.0189999999999999058530875"
しかし、それは何によってスケーリングされるのでしょうか? 各ベクトルの長さが 1 の場合、平均絶対差は 2 つの数値の差に等しくなければならず、平均絶対差で割ると 1 になります。明らかに、ここでの論理が間違っていることを理解しています。