x86 と x64 の間の浮動小数点演算の矛盾を理解する
コンピューター プログラミングの分野では、浮動小数点演算の違いを理解するx86 アーキテクチャと x64 アーキテクチャの間で処理されると、予期しない結果が生じる可能性があります。このクエリは、特に Microsoft Visual Studio 2010 ビルドでの 2 つの浮動小数点値の比較に関係する、このような不一致を調査します。
問題
x86 で次のコード スニペットを実行する同じ 64 ビット マシン上の x64 ビルドでは、不一致が明らかになります。
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;
ブール値 bLarger1 は両方のビルドで false のままですが、bLarger2 は x64 では false ですが、x86 では true です。この矛盾により、これらのアーキテクチャにおける浮動小数点演算の基礎となる仕組みについて疑問が生じます。
原因
問題の核心は式の評価にあります。
bool bLarger2 = (a * c) < b;
x86 と x64 の両方で生成されたアセンブリ コードを調べると、重要な違いが明らかになります。 x64 では、計算は純粋な単精度命令を使用して実行されます。対照的に、x86 は、より高精度 (デフォルトでは倍精度) で動作する x87 浮動小数点ユニットを利用します。
説明
この違いは次のような理由から生じます。 x87 FPU と x64 SSE ユニットの基本的な違い。 x87 ユニットは単精度計算と倍精度計算の両方に同じ命令を使用するため、単精度演算ではある程度の不正確さが生じます。一方、SSE ユニットは精度ごとに個別の命令を使用し、正確な単精度計算を保証します。
解決策
この矛盾を 32 で解決するには、 bit (x86) ビルドでは、次の制御フラグを使用して x87 ユニットに単精度計算を実行させることができます:
_controlfp(_PC_24, _MCW_PC);
これにより、両方のブール変数 (bLarger1 と bLarger2) が設定されます。
結論
x86 と x64 の間の浮動小数点演算の不一致は、基礎となる浮動小数点ユニットの違いに起因します。これらの違いを理解し、x86 で単精度計算を強制するなどの適切な措置を講じることにより、プログラマーは、異なるアーキテクチャ間で正確で一貫した結果を保証できます。
以上がx86 アーキテクチャと x64 アーキテクチャの浮動小数点演算で異なる結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。