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

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

Nov 01, 2024 am 04:17 AM

Why Does Floating Point Arithmetic in x86 and x64 Architectures Produce Different Results?

x86 と x64 の間の浮動小数点演算の矛盾を理解する

コンピューター プログラミングの分野では、浮動小数点演算の違いを理解するx86 アーキテクチャと x64 アーキテクチャの間で処理されると、予期しない結果が生じる可能性があります。このクエリは、特に Microsoft Visual Studio 2010 ビルドでの 2 つの浮動小数点値の比較に関係する、このような不一致を調査します。

問題

x86 で次のコード スニペットを実行する同じ 64 ビット マシン上の 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;
ログイン後にコピー

ブール値 bLarger1 は両方のビルドで false のままですが、bLarger2 は x64 では false ですが、x86 では true です。この矛盾により、これらのアーキテクチャにおける浮動小数点演算の基礎となる仕組みについて疑問が生じます。

原因

問題の核心は式の評価にあります。

bool bLarger2 = (a * c) < b;
ログイン後にコピー

x86 と x64 の両方で生成されたアセンブリ コードを調べると、重要な違いが明らかになります。 x64 では、計算は純粋な単精度命令を使用して実行されます。対照的に、x86 は、より高精度 (デフォルトでは倍精度) で動作する x87 浮動小数点ユニットを利用します。

説明

この違いは次のような理由から生じます。 x87 FPU と x64 SSE ユニットの基本的な違い。 x87 ユニットは単精度計算と倍精度計算の両方に同じ命令を使用するため、単精度演算ではある程度の不正確さが生じます。一方、SSE ユニットは精度ごとに個別の命令を使用し、正確な単精度計算を保証します。

解決策

この矛盾を 32 で解決するには、 bit (x86) ビルドでは、次の制御フラグを使用して x87 ユニットに単精度計算を実行させることができます:

_controlfp(_PC_24, _MCW_PC);
ログイン後にコピー

これにより、両方のブール変数 (bLarger1 と bLarger2) が設定されます。

結論

x86 と x64 の間の浮動小数点演算の不一致は、基礎となる浮動小数点ユニットの違いに起因します。これらの違いを理解し、x86 で単精度計算を強制するなどの適切な措置を講じることにより、プログラマーは、異なるアーキテクチャ間で正確で一貫した結果を保証できます。

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

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか? Mar 03, 2025 pm 05:52 PM

C言語関数によって返される値の種類は何ですか?返品値を決定するものは何ですか?

GULC:Cライブラリはゼロから構築されています GULC:Cライブラリはゼロから構築されています Mar 03, 2025 pm 05:46 PM

GULC:Cライブラリはゼロから構築されています

c言語関数形式文字ケース変換手順 c言語関数形式文字ケース変換手順 Mar 03, 2025 pm 05:53 PM

c言語関数形式文字ケース変換手順

C言語関数の定義と呼び出しルールは何ですか、そして C言語関数の定義と呼び出しルールは何ですか、そして Mar 03, 2025 pm 05:53 PM

C言語関数の定義と呼び出しルールは何ですか、そして

メモリに保存されているC言語関数の返品値はどこにありますか? メモリに保存されているC言語関数の返品値はどこにありますか? Mar 03, 2025 pm 05:51 PM

メモリに保存されているC言語関数の返品値はどこにありますか?

明確な使用法とフレーズ共有 明確な使用法とフレーズ共有 Mar 03, 2025 pm 05:51 PM

明確な使用法とフレーズ共有

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか? Mar 12, 2025 pm 04:52 PM

STL(ソート、検索、変換など)のアルゴリズムを効率的に使用するにはどうすればよいですか?

C標準テンプレートライブラリ(STL)はどのように機能しますか? C標準テンプレートライブラリ(STL)はどのように機能しますか? Mar 12, 2025 pm 04:50 PM

C標準テンプレートライブラリ(STL)はどのように機能しますか?

See all articles