13

What are some good do-s and don't-s for floating point arithmetic (IEEE754 in case there's confusion) to ensure good numerical stability and high accuracy in your results?

I know a few like don't subtract quantities of similar magnitude, but I'm curious what other good rules are out there.

4

7 に答える 7

12

まず、浮動小数点数は必ずしも実数と同じ規則に従うとは限らないという概念を入力します...これを受け入れると、ほとんどの落とし穴を理解できるようになります。

これが私がいつも従ってきたいくつかのルール/ヒントです:

  • 浮動小数点数をゼロなどと比較しないでください(つまり、次のことは行いません。if (myFloat == 0)
  • 結合法則は浮動小数点には当てはまりません...意味(a + b) + c != a + (b + c)
  • 常に丸めがあることを忘れないでください
  • 浮動小数点数は必ずしも一意の逆数を持っているとは限りません
  • 浮動小数点数によるクロージャはありません...浮動小数点演算の結果が有効な浮動小数点数になるとは決して想定しないでください。
  • 分配法則は保持されません
  • 浮動小数点比較の使用は絶対に避けてください...丸め誤差は予期しない結果を引き起こす可能性があるためです
于 2010-06-23T14:46:36.630 に答える
5

浮動小数点の動作を理解してください。

簡単なルールで正しく使用できるとは思わないでください。

たとえば、少なくとも 2 つの回答で、浮動小数点数の比較は禁止されるべきであると提案されました。最初に、それらが等しいかどうかを比較することが必要な場合があります。次に、範囲チェックを行うことが必要な場合は、落とし穴があることにも注意する必要があります。たとえば、ほとんどの人が同等性テストで想定するプロパティである推移的ではないなどです。

于 2010-06-23T15:14:29.737 に答える
5

浮動小数点数に関する #1 の「してはいけない」ルールは次のとおりです。

整数で十分な場合は、浮動小数点数を使用しないでください。

于 2010-06-23T14:52:12.947 に答える
4

不完全な浮動小数点演算のために人々が死亡し、数十億ドルの損害が発生したことを覚えておいてください。

于 2010-06-23T16:05:36.420 に答える
0

浮動小数点の落とし穴を回避するための私の「主な武器」は、それらの動作方法をしっかりと把握することです。クリス・ヘッカーが基本をかなりよく説明していると思います。

于 2010-06-25T10:50:02.503 に答える
0

等しい比較をしようとしないでください

ダブルダ、デシベル;

...

もし (da==db) なら何か。

C はデフォルトで double を使用するので、単精度を使用する場合は明確にしてください。

フロート fa,fb;

...

fa = fb + 1.0;

fb を double に変換し、double を加算してから single に変換し、single equal を実行します

その代わり

fa = fb + 1.0F。

すべてシングル。

1.0 のような整数を使用する場合は、コード内でそれを小数にしないでください。ascii番号を最小限に抑えることができれば、コンパイラ/ツールの信頼性が向上します。それで

fa = fb + 1;

または代わりに

fa = fb + 0.3333333F;

このようなことをしてください(精度に興味がある場合)。

FC = 1; fc = fc / 3; fa = fb + fc;

他にもたくさんありますが、浮動小数点は苦痛であり、コンパイラとライブラリはそれほど良くありません。fpu にはバグがあり、IEEE は非常に苦痛で、さらに多くのバグにつながります。残念ながら、それが私たちがほとんどのプラットフォームで生きている世界です。

于 2010-06-23T14:44:51.720 に答える
-1

「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」を検索、ダウンロード、および読む

于 2010-06-23T15:12:21.383 に答える