0

Fortran 90 で多次元最適化用の BFGS アルゴリズムのバージョンをプログラミングしています。コードを書き、ラップトップ (Windows Vista を実行) で gfortran を使用してコンパイルしましたが、正常に動作します。しかし、Linux 6 を実行しているサーバーで同じコードを使用しようとすると、正しくない結果が返されます。これはまったく同じコードであり、正常にコンパイルされますが、生成される結果は間違っています。つまり、アルゴリズムの初期段階で浮動小数点演算エラーが発生しているようで、NaN の生成を開始する前に数値結果の 1 行しか生成しません。サーバー環境に関するものだとしか思えませんが、どうすればそれが何であるかを見つけて、それに応じてコードを修正できますか?

4

1 に答える 1

1

問題はここ (CERT.org) で説明されています: FLP00-C。浮動小数点数の制限を理解する

この動作の理由は、Linux が IA-32 マシンで x87 浮動小数点ユニット (FPU) の内部拡張精度モードを使用して、計算中の精度を向上させるためです。c への代入によって結果がメモリに格納されると、FPU は自動的に結果を丸め、double に収まるようにします。メモリから読み戻された値は、精度が拡張された内部表現と不均等に比較されるようになりました。Windows は拡張精度モードを使用しないため、すべての計算は倍精度で行われ、メモリに格納された値と FPU 内部の値との間で精度に違いはありません。GCC の場合、最適化レベル 1 以上でコンパイルすると、メモリへの不要なストアが排除されるため、すべての計算は拡張精度で FPU 内で行われます。

解決策は、 FLP02-Cで説明されています。正確な計算が必要な場合は、浮動小数点数を使用しないでください。次の 2 つの例があります。問題を示す間違った例と、問題のない修正された例です。

「このコードは、浮動小数点数を内部加算の整数に置き換えることで修正できます。浮動小数点数は、結果を出力するときと、除算を行って平均を計算するときにのみ使用されます。」

于 2012-12-14T06:00:05.020 に答える