4

function のどういうわけか奇妙な (または単に予期しない?) 動作に遭遇しましたseq。単純なシーケンスを作成する場合、一部の値は == 演算子では正しく一致しません。この最小限の例を参照してください。

my.seq <- seq(0, 0.4, len = 5)
table(my.seq)                  # ok! returns  0 0.1 0.2 0.3 0.4 
                               #              1   1   1   1   1 

which(my.seq == 0.2)           # ok! returns  3
which(my.seq == 0.3)           # !!! returns  integer(0)

シーケンスを手動で作成すると、うまくいくように見えますが、次のようになります。

my.seq2 <- c(0.00, 0.10, 0.20, 0.30, 0.40)

which(my.seq2 == 0.3)           # ok! returns  4

それについて何か説明はありますか?を使用して問題を解決しましたwhich(round(my.seq, 2) == 0.3)が、問題の原因に興味があります。

コメントありがとうございます。

4

3 に答える 3

4

コンピュータは浮動小数点数をうまく表現できません。これを隠すスプレッドシートの一般的な傾向は、ほとんどの人がコンピューターで数値を処理する主な方法であるため、多くの問題を引き起こしています。

正確な浮動小数点値とは決して一致しません。R にはこれに対処するための関数があります (例: all.equal) が、私は次のことを好みます。

未知の浮動小数点変数 A があり、それが 0.5 に等しいかどうかを確認したいとします。

abs(A - 0.5) < tol

許容範囲を 0.5 にどれだけ近づけるかを設定します。たとえば、tol <- 0.0001あなたにとっては問題ないかもしれません。

値が丸められた整数である必要があるように見える場合。または、テストする 10 進レベルがわかっている場合は、その 10 進レベルに丸めることができます。

于 2012-07-31T15:05:04.040 に答える
3

コンピュータは、正確な値を保存するのに苦労しています。

> options(digits=22)
> seq(0, .4, len = 5)
[1] 0.0000000000000000000000 0.1000000000000000055511 0.2000000000000000111022
[4] 0.3000000000000000444089 0.4000000000000000222045
> .4
[1] 0.4000000000000000222045
> c(0, .1, .2, .3, .4)
[1] 0.0000000000000000000000 0.1000000000000000055511 0.2000000000000000111022
[4] 0.2999999999999999888978 0.4000000000000000222045

2 進浮動小数点表現を使用しているため、目的の値を正確に表現することはできません。.4 の値は .4 よりも少し高いため、.3 自体を入力する場合よりも .3 の値が少し高いように見えます。他の誰かがこれについてより良い説明を提供すると確信していますが、これが問題に光を当てることを願っています.

于 2012-07-31T14:40:21.223 に答える
2

これはFAQ 7.31で、問題全般に関するより長い議論へのリンクもあります。

于 2012-07-31T15:28:31.123 に答える