ホームページ  >  記事  >  バックエンド開発  >  MS VS 2010 の x86 ビルドと x64 ビルドで浮動小数点演算の結果が異なるのはなぜですか?

MS VS 2010 の x86 ビルドと x64 ビルドで浮動小数点演算の結果が異なるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-31 19:36:02646ブラウズ

Why Do Floating-Point Arithmetic Results Differ Between x86 and x64 Builds in MS VS 2010?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。