MS VS 2010 の x86 と x64 の間で浮動小数点演算の不一致
Microsoft Visual Studio 2010 では、浮動小数点演算で不一致が発生します同じ 64 ビット マシンで実行した場合でも、x86 ビルドと x64 ビルドの間で実行されます。これは、次のコード スニペットで明らかです。
<code class="c++">float a = 50.0f; float b = 65.0f; float c = 1.3f; float d = a*c; bool bLarger1 = d < b; bool bLarger2 = (a*c) < b;</code>
ブール変数 bLarger1 は一貫して false であり、両方のビルドで d が 65.0 に設定されています。ただし、bLarger2 は x64 では false ですが、x86 では true です。
犯人: x87 対 SSE
この矛盾は、x86 ビルドが x87 を使用しているという事実から生じます。 x64 ビルドでは Streaming SIMD Extensions (SSE) ユニットが使用されますが、浮動小数点ユニット (FPU) が使用されます。違いは計算の精度にあります。
x87 FPU は、単精度値を処理する場合でも、デフォルトで倍精度で計算を実行します。一方、SSE ユニットは純粋な単精度で計算を実行します。その結果、x87 の計算は SSE の計算よりわずかに正確になります。
この場合、x87 FPU の精度の向上により丸め誤差が生じ、d が 65.0 よりわずかに小さくなります。これにより、x86 では bLarger2 が false になります。対照的に、x64 での SSE 計算では d のより正確な値が生成され、bLarger2 の真の値が得られます。
x86 の回避策
x86 ビルドを強制するには単精度で計算を実行するには、次の行を追加できます。
<code class="c++">_controlfp(_PC_24, _MCW_PC);</code>
これは、すべての計算を単精度で実行するように浮動小数点制御ワードを設定します。この変更により、x86 ビルドと x64 ビルドの両方で bLarger1 と bLarger2 の両方が false に設定されます。
結論
x86 と x64 の間の浮動小数点演算の不一致MS VS 2010 のビルドは、x87 FPU と SSE ユニットの違いに起因します。 x87 FPU の高精度により、SSE ユニットの真の単精度計算と比較して値がわずかに異なります。 x86 で単精度計算を強制することで、開発者はこの問題を軽減し、異なるプラットフォーム間で一貫した結果を保証できます。
以上がMS VS 2010 の x86 ビルドと x64 ビルドで浮動小数点演算の結果が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。