x86 と x64 の間の浮動小数点演算の不一致
Visual Studio 2010 では、x86 ビルドと x64 ビルドの間で浮動小数点演算に顕著な違いが見られます特定の式の値を比較するときに発生します。この不一致は、次のコードに現れています。
float a = 50.0f; float b = 65.0f; float c = 1.3f; float d = a * c; bool bLarger1 = dx86 アーキテクチャと x64 アーキテクチャでは、2 番目の式 bLarger2 の処理方法が異なります。 x86 ビルドでは、bLarger2 は true と評価されますが、x64 ビルドでは false と評価されます。この不一致の原因は、浮動小数点演算における式 (a * c) の計算にあります。
不一致の起源
不一致の原因は、異なる点にあります。 x86 の場合は x87、x64 の場合は SSE という 2 つのアーキテクチャで使用される浮動小数点ユニット。 2 つのユニットの基本的な違いは精度です。 x87 ユニットはデフォルトで単精度より高い精度 (通常は倍精度) を使用しますが、SSE ユニットは単精度のみで動作します。
不一致の修正
不一致がある場合は、x87 ユニットの精度を SSE ユニットの精度と一致するように手動で構成できます。これは、次を実行することで 32 ビット コードで実現できます:
_controlfp(_PC_24, _MCW_PC);精度を単精度に設定すると、(a * c) の評価が行われます。 bLarger2 式は x64 ビルドの式と一致し、bLarger1 と bLarger2 の両方が false に設定されます。
結論
両者の浮動小数点演算の違いx86 および x64 ビルドは、x87 および SSE 浮動小数点ユニットの異なる精度レベルに基づいています。 x87 ユニットの精度を SSE ユニットの精度と一致するように手動で制御することで、不一致を排除し、両方のアーキテクチャ間で式の一貫した評価を保証できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3