2009-03-12 8 views

答えて

1

信頼性に関係なく、モジュロメソッドはわかりやすく(仕様を読む必要はなく)高速(関数呼び出しなし)に見えます。

1

浮動小数点数の古典的な問題は近似値に過ぎません。あなたがこれを行う場合:

floatingPoint = 1.0/3.0; 
floatingPoint *= 3; 

をあなたはに近いものになってしまいますが、正確に、1

2

フローティングポイントが正確にいくつかの整数を表すことができないので、本当にある方法がないではありません信頼できる。具体的には、2^24より大きいintは、floatで正確に表すことはできません。それは、あなたが浮動小数点表記を使って支払う価格の一部です!

浮動小数点に関するさまざまな問題の優れた概要を知っておく必要があるので、私は"What Every Computer Scientist Should Know About Floating-Point Arithmetic"をチェックアウトすることをお勧めします。

5

浮動小数点数には、通常、割り当てられた数値に最も近い可能性のある近似値しか含まれていないため、完全に等しいかどうかをチェックしないでください。

たとえば、タイプに最も近い可能性のある42の値は、42.00000000000000662のようなもので、これも整数値としてカウントします。

値と丸めた値の差を取り、その後、(それは否定しませんように)その値の絶対値を取り、小さな値と比較:

if (Math.Abs(Math.Round(floatingPoint) - floatingPoint) < 0.000001) ... 
+0

整数はで正確に表現することができます浮動小数点表記法。 42.00000000000000662というあなたの例は、単に起こることはありません。 –

+0

これは良い考えではありません。最終的には、連続するビット浮動小数点表記の違いは0.5より大きくなり、数値が表すはずの整数が明確ではありません。 –

+0

@ジミー:そうではありません。 2^31-1を単精度浮動小数点の実装で正確に表現してみてください。 –

1

は、一般的に信頼性の高い何ありません方法。

浮動小数点数は、前回の計算の結果であれば(ほとんどの場合)常に近似値なので、他のものが指摘しているように、単純な整数等価は存在しません。

あなたは、FP、あなたが扱っているのint値の両方の範囲精度を考慮する必要があります。それはすべてあなたが達成しようとしているものに依存します。

Guffaは、int比較のために許容される精度の範囲を使用して良いアプローチをしています。

0

整数は、あなたが正確な整数をチェックしている場合、それらのいずれかが動作するはずですので、浮動小数点表現で正確に表現することができます(個人的に私は最初のものを使用すると思います...)

関連する問題