C/C++で特定のアルゴリズムを実装することによって解決する必要がある科学計算の問題の大部分は、倍精度よりはるかに低い精度が要求されます。たとえば、1e-6
,1e-7
の精度は、ODEソルバーまたは数値積分の場合の99%
の精度をカバーします。私たちがより高い精度を必要とするまれなケースでも、通常、倍精度に近い精度に達することを夢見る前に数値的方法自体が失敗します。例:単純なRunge-Kutta法から1e-16の精度を期待することはできません。この場合、倍精度の要件は、間違った答えのより良い近似を求めることと似ています。浮動小数点の最適化 - ガイドライン
次に、積極的な浮動小数点の最適化は、コードをより高速に(非常に速く!)し、特定の問題のターゲット精度に影響を与えないため、ほとんどの場合Win-Winのようです。つまり、特定の実装/コードがfpの最適化に対して安定していることを確認することは非常に難しいようです。古典的な(やや邪魔になる)例:GNU科学ライブラリであるGSLは、市場の標準的な数値ライブラリだけでなく、非常によく書かれた図書館でもあります(より良い仕事をしているとは思いません)。しかし、GSLはfpの最適化に対して安定していません。例えば、intelコンパイラを使ってGSLをコンパイルすると、フラグをオンにしてfpの最適化を無効にしない限り、内部テストは失敗します。
私の質問は、積極的な浮動小数点最適化に対して安定したコードを記述するための一般的なガイドラインがあるかどうかです。これらのガイドラインは言語(コンパイラ)固有のものですか?もしそうなら、C/C++(gcc/icc)ベストプラクティスは何ですか?
注1:この質問では、gcc/iccのfp最適化フラグについては問いません。
注2:この質問では、C/C++最適化(ロットと呼ばれる小さな関数に仮想関数を使用しないなど)の一般的なガイドラインについては問いません。
注3:この質問は、ほとんどの標準fp最適化(x/x - > 1など)のリストを要求していません。
注4:これは、古典的な「最もクールなサーバー名」に似ている主観的/非主観的な質問ではないと強く信じています。あなたが同意しない場合(私が具体的な例/コード/問題を提供していないため)、コミュニティのwikiとしてフラグを立ててください。私はいくつかのステータスポイントを得ることよりも、答えにもっと興味があります(重要ではない - あなたがポイントを得る!)。
エラーが蓄積されます。すべての計算が倍精度で行われても、最終結果は最後のビットまでは正確ではありません。どこでもfloatを使用している場合は、適切なエラー解析を行い、回答のビット数が信頼できるものであればそれを調べる必要があります。もちろん、同じことを二重に行うべきです。 –
一般的な数値の安定性は、慎重に選ばれた、ほとんど脆弱な中間ステップを介して行われることが多く、特に有限精度浮動小数点演算の非結合文字を克服するように設計されています。積極的な最適化は、例えば、実行順序を変更して反復調整が助けになるかもしれませんが、答えを得るのに時間がかかります。プロのヒント:質問を[Computational Science](http://scicomp.stackexchange.com/)のサイトに掲載したいかもしれません。 –