C++の丸め誤差について読んでいたところです。したがって、数学を多用するプログラム(または重要な計算)を作成している場合は、フロートをすべてまとめてドロップし、doubleのみを使用する必要がありますか、それとも丸め誤差を防ぐためのより簡単な方法がありますか?
3 に答える
必須の講義:すべてのプログラマーが浮動小数点演算について知っておくべきこと。
また、 IEEE浮動小数点標準を読んでみてください。
常に丸め誤差が発生します。あなたが使用しない限り無限gmplibのような任意精度ライブラリ。アプリケーションが本当にこの種の作業を必要とするかどうかを判断する必要があります。
または、整数演算を使用して、必要な場合にのみ浮動小数点数に変換することもできます。これはまだ難しいので、それだけの価値があるかどうかを判断する必要があります。
最後に、表現の精度の限界で値について仮定しないように使用float
または注意することができます。このValgrindプラグインdouble
が実装されていればいいのですが(floatのgrep)...
丸め誤差は、フロートを使用している場合でも、通常は非常に重要ではありません。非常に多数の浮動小数点計算を行うゲームのような数学的に強力なプログラムは、依然として単精度を使用することがよくあります。
これは、最大数が100億未満で、C++倍精度を使用している場合に機能する可能性があります。
if ( ceil(10000*(x + 0.00001)) > ceil(100000*(x - 0.00001))) {
x = ceil(10000*(x + 0.00004)) / 10000;
}
これにより、少なくとも最後の桁が+/- 9オフになるはずです。1000で割ると、常に小数点以下の桁数が移動すると思います。そうでない場合は、バイナリで実行できる可能性があります。
+、-、*、または比較ではないすべての操作の後に適用する必要があります。たとえば、同じ数式で2つの除算を行うことはできません。これは、各除算に適用する必要があるためです。
それが機能しない場合は、数値をスケールアップして整数で作業し、常に整数除算を使用できます。高度な関数が必要な場合は、決定論的な整数演算を行うパッケージがあるかもしれません。映画「TheOffice」のように丸め誤差が悪用される可能性があるため、多くの財務設定では整数除算が必要です。