C または C++ で浮動小数点の丸め誤差の蓄積を減らすための一般的に適用できるヒントはありますか? 最適なアセンブリ言語命令にコンパイルされるコードの書き方を主に考えていますが、全体的なアルゴリズム設計に関する戦略も歓迎します。
5 に答える
数値解析は数学の全分野であり、盲目的に適用できるいくつかのヒントに限定されていません。
私が知っている唯一の秘訣は、多数の数値を合計するときは、一度に 1 つずつ計算するのではなく、加算がほぼ同じ大きさの数値になるようにグループ化することです。たとえば、乱数の巨大な配列を合計するには、ペアごとに再帰的に合計します。
人々はこのことについて博士号を書いているので、ここでは本当に確かなアドバイスは得られず、ヒントだけが得られます。1つのヒントは、値がかなり近い数値を減算しないようにすることです。これは、ノイズビットの影響を増幅します。
FPU の拡張浮動小数点精度を有効にして、内部で 10 バイトを使用することができます。これが私たちが使用するものです。
http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm
同様の大きさの数値に対して演算が実行されるように、数値をソートすることもできます。
単一の式でできるだけ多くの浮動小数点演算を実行したり、演算へのすべての入力が浮動小数点形式に変換されていることを確認したりするなど、できる小さなことはたくさんあります。浮動小数点と整数を切り替える場合は、整数変換の前に浮動小数点数に係数 0.5 を追加して、値が最も近い整数に丸められるようにしてください。double または long double を使用すると、精度が向上するため、丸め/累積誤差の重要性が軽減されます。
いくらかの丸め誤差が発生するため、探している重要度を超えてそれらをプッシュする必要があります。これに対するオプションの 1 つは、 High Precision Arithmetic Libraryなどの拡張精度浮動小数点ソフトウェア ライブラリを使用することです。ライブラリを使用すると、操作が遅くなりますが、精度が高くなるという利点があります。