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

Barbara Streisand
リリース: 2024-11-03 03:12:29
オリジナル
945 人が閲覧しました

Why does floating-point arithmetic produce different results between x86 and x64 architectures?

浮動小数点演算の不一致: 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;
ログイン後にコピー

不一致:

  • x86 Build: 変数 bLarger1 は false (d と b の両方)
  • x64 Build: bLarger1 と bLarger2 は両方とも false。

根本的な問題:

この不一致は、式 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート