すでにこの質問を読んだので、同じ入力 (同じハードウェア上で、同じコンパイラでコンパイルされた) で浮動小数点演算を使用する特定のプロセスが決定論的であるべきであると合理的に確信しています。これが正しくないケースを調べており、何が原因なのかを突き止めようとしています。
実行可能ファイルをコンパイルし、まったく同じデータを単一のマシン (非マルチスレッド) で実行していますが、約 3.814697265625e-06 のエラーが発生しています。 /4^9 = 1/2^18 = 1/262144. これは、32 ビット浮動小数点数の精度レベルにかなり近い (ウィキペディアによると約 7 桁)
私の疑いは、コードに適用された最適化と関係があるということです。Intel C++ コンパイラを使用しており、浮動小数点のスペキュレーションをセーフまたはストリクトではなく高速に変更しました。これにより、浮動小数点プロセスが非決定論的になる可能性がありますか? この動作につながる可能性のある他の最適化などはありますか?
編集: Pax の提案に従って、浮動小数点の推測を安全に変更してコードを再コンパイルしたところ、安定した結果が得られました。これにより、この質問を明確にすることができます-浮動小数点投機は実際に何をしますか?これにより、まったく同じ入力に適用されたときに同じバイナリ (つまり、1 つのコンパイル、複数の実行) が異なる結果を生成するのはなぜですか?
@Ben Intel(R) C++ 11.0.061 [IA-32] を使用してコンパイルしており、Intel クアッドコア プロセッサで実行しています。