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

x86 アーキテクチャと x64 アーキテクチャで浮動小数点演算が異なるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-03 10:05:03964ブラウズ

Why Does Floating Point Arithmetic Differ Between x86 and x64 Architectures?

x86 と x64 の浮動小数点演算の違い

x86 と x64 の両方のアーキテクチャの MS VS 2010 で同一のコードを実行する場合(どちらも 64 ビット マシンで実行されている)、浮動小数点演算に顕著な違いが現れました。

次のコード スニペットを考えてみましょう:

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 ビルドの両方で、bLarger1 は残ります。 false (d は 65.0 に設定されます)。ただし、x64 ビルドでは bLarger2 は false ですが、x86 ビルドでは true です。

この不一致は、式 bLarger2 = (a * c)

から生じます。 b.生成されたコードは、x86 では評価が単精度 (通常は倍精度) を超える x87 ユニットで実行されるのに対し、x64 では純粋な単精度を実行する x64 ユニットで評価が実行されることを示しています。 -精度の計算。

32 ビット ユニットが単精度で計算を実行できるようにするには、次の制御ワードを設定できます。
_controlfp(_PC_24, _MCW_PC);

これにより、両方のブール値が次のように設定されます。 32 ビット プログラムでは false です。

根本的な問題は、x87 浮動小数点ユニットと SSE 浮動小数点ユニット間の固有の違いに起因します。 x87 ユニットは単精度型と倍精度型の両方に同一の命令を使用しますが、SSE ユニットはそれぞれに異なる命令を使用します。その結果、コンパイラは SSE ユニットの計算精度をより詳細に制御できます。

全体として、x86 と x64 の浮動小数点演算の間の差異は、それぞれの浮動小数点ユニットの動作モードに起因します。一貫した動作を確保するには、32 ビット ターゲットであっても SSE 命令を発行するようにコンパイラーを説得するためのオプションを検討することをお勧めします。

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

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