ホームページ >バックエンド開発 >C++ >Visual Studio 2010 では浮動小数点演算が x86 と x64 で異なるのはなぜですか?

Visual Studio 2010 では浮動小数点演算が x86 と x64 で異なるのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 05:04:27256ブラウズ

Why does floating-point arithmetic differ between x86 and x64 in Visual Studio 2010?

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 = d < b;
bool bLarger2 = (a * c) < b;

x86 アーキテクチャと 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);

精度を単精度に設定すると、bLarger2 式の (a * c) の評価が x64 の評価と一致します。

結論

x86 ビルドと x64 ビルドの浮動小数点演算の違いは、明確な精度レベルに起因します。 x87 および SSE 浮動小数点ユニットの。 x87 ユニットの精度を SSE ユニットの精度と一致するように手動で制御することで、不一致を排除し、両方のアーキテクチャ間で一貫した式の評価を保証できます。

以上がVisual Studio 2010 では浮動小数点演算が x86 と x64 で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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