3

カウンターを0.05インクリメントする必要がある関数をRで記述しています。カウンターの値を条件にすると、値が表示されているものではないと言われます。

例:

カウンターを0に設定します

cntr <-0; cntr;

[1] 0

カウンターを0.05インクリメントし、テストします

cntr <-cntr + 0.05; cntr; [1] 0.05

> cntr == 0.05
[1] TRUE

ここまでは順調ですね。しかし、さらに2、3回繰り返すと、次のことが起こります。

> cntr <- cntr + 0.05; cntr;
[1] 0.1
> cntr == 0.1
[1] TRUE
> cntr <- cntr + 0.05; cntr;
[1] 0.15
> cntr == 0.15
[1] FALSE

何が起こっているのか、そしてその理由は?cntrに返される値は0.15ですが、この値と等しくありませんか?さらなる調査により、これが明らかになりました。

> cntr < 0.1500000000000001
[1] TRUE
> cntr < 0.15000000000000001
[1] FALSE

round(cntr、2)== 0.15 [1] TRUE

私は何かを誤解していますか、それとも私が見ていない何かがありますか?どんな助けでも大歓迎です。ありがとうございました。

4

3 に答える 3

5

代わりに、を使用する必要がありますisTRUE(all.equal(cntr, x))。ここで、xは0.1、0.05などです。浮動小数点の丸め誤差が原因で、テストが失敗しています。all.equalそのエラーまでの同等性をテストします。これがあなたをつまずかせるかもしれない他の例については、 Rインフェルノのサークル1をチェックしてください。

于 2012-09-10T20:32:59.460 に答える
3

これに対するもう1つのアプローチは、整数を使用して、をインクリメントすること5です。増分値を使用する必要がある場合は、100で割ります。

あなたが説明した問題は、バイナリ形式を使用するときに10進値がコンピュータプログラムにどのように保存されるかによるものです。に固有の問題ではありませんR。この理由について詳しくは、こちらをご覧ください。

于 2012-09-10T20:33:40.227 に答える
3

広い意味では、あなたはRプログラミングにかなり慣れていないように見えますが、なぜカウンターを使おうとしているのかをお聞きしたいと思います。一般に、Rはループ、特にカウンターが含まれるループの使用を推奨しません。カウンター付きのループを使用している場合は、関数をベクトル化してコードの効率を向上させることができる可能性があります。

于 2012-09-10T20:34:34.983 に答える