最適化による浮動小数点の不一致: コンパイラのバグまたは固有の精度
浮動小数点値を丸めることを目的とした提供されたコードは、発散を示していますさまざまなコンパイラと最適化設定での動作。この不一致は、最適化中の浮動小数点精度の処理の不一致に起因します。
Intel x86 プロセッサは内部で 80 ビットの拡張精度を採用していますが、double は通常 64 ビットのデータ型です。最適化レベルは、浮動小数点値がメモリに格納される頻度に影響し、80 ビット精度から 64 ビット精度への丸めにつながります。
これを軽減するには、-ffloat-store gcc オプションを使用して、最適化レベル全体で一貫した浮動小数点の結果。あるいは、gcc では通常 80 ビット幅の long double 型を使用すると、80 ビットと 64 ビットの精度の間で発生する丸めの問題を回避できます。
man gcc ドキュメントによると、-ffloat-storeオプション:
このオプションは、プログラムが IEEE 浮動小数点の正確な定義を必要とし、次の形式で保存された中間計算に依存するシナリオでよく役立ちます。
x86_64 ビルドでは、コンパイラはデフォルトで float と double に SSE レジスタを利用し、拡張精度の使用を排除して問題の問題を軽減します。 gcc コンパイラ オプション -mfpmath は、この動作を制御します。
以上が最適化中に浮動小数点の丸めの不一致が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。