浮動小数点演算の不一致: x86 と x64
浮動小数点演算を含むコード スニペットで、MS VS 間で不一致が発生します。 2010 ビルドは x86 および 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;
不一致:
根本的な問題:
この不一致は、式 bool bLarger2 = (a*c)
浮動小数点ユニットの違い:
主な違いは、2 つで使用される浮動小数点ユニットにあります。建築。 x86 アーキテクチャは、単精度 (通常は倍精度) よりも高い精度で計算を実行する x87 浮動小数点ユニットを使用します。対照的に、x64 アーキテクチャは、純粋な単精度計算を実行する SSE 浮動小数点ユニットを使用します。
乗算への影響:
bLarger1 式では、 a と c の乗算は、ハードウェア乗算命令によって実行されます。この命令は倍精度を使用するため、d は 65.0 に設定されます。
ただし、bLarger2 式では、型変換 (a*c) により、乗算は明示的に単精度で実行されます。この結果、(a*c) は 64.999992 に設定されます。
x87 精度制御:
デフォルトでは、x87 ユニットは倍精度で動作します。ただし、_controlfp 関数を使用してユニットに単精度計算を実行させることは可能です。
_controlfp(_PC_24, _MCW_PC);
この行を 32 ビット コードに追加すると、bLarger1 と bLarger2 の両方が false に設定されます。
コンパイラ オプション:
Visual Studio のより新しいバージョンでは、コンパイラは 32 ビット ターゲットに対しても SSE 命令を発行する場合があります。これにより、異なるアーキテクチャ間で浮動小数点演算の一貫性が確保されます。
以上がx86 アーキテクチャと x64 アーキテクチャで浮動小数点演算の結果が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。