最適化が有効になっている場合の異なる浮動小数点の結果: コンパイラーの動作の詳細
浮動小数点演算を使用する場合、以下のことが重要です。コンパイラの最適化によって生じる可能性のあるニュアンスを理解します。提供されたコード スニペットに示されているように、最適化レベルが異なると、浮動小数点計算の精度に予期せぬ結果が生じる可能性があります。
調査と説明
コードの目的は丸めです。倍精度浮動小数点値を指定した桁に変換します。ただし、 g で最適化を有効にすると、結果は予想される出力から逸脱します。この動作は、Intel x86 プロセッサが内部で浮動小数点計算に拡張精度 (80 ビット) を利用しているという事実に起因します。対照的に、倍精度変数は通常 64 ビットを占有します。
最適化が無効 (O0) の場合、コンパイラは浮動小数点値をメモリに格納し、80 ビット精度が維持されるようにします。ただし、最適化が有効になっている場合 (O1 ~ O3)、コンパイラは値をレジスタに保持することでプロセッサの拡張された精度を利用します。この最適化により、最終的に値がメモリに格納され、80 ビット精度から 64 ビット精度に変換されるときに丸め誤差が発生する可能性があります。
解像度オプション
軽減するにはこの問題については、次の解決策をお勧めします:
その他の考慮事項:
Visual Studio 2008 について
/fp:fast 最適化が有効になっている場合でもコードが正しい結果を生成するという興味深い観察結果Visual Studio 2008 は、この状況におけるコンパイラの信頼性を証明しています。一般に g には -ffloat-store オプションを使用することが推奨されますが、Visual Studio 2008 ではこの問題をより効果的に処理できるようです。
以上がコンパイラの最適化を有効にすると浮動小数点の計算が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。