ホームページ > バックエンド開発 > C++ > C および x86 アセンブリで IEEE 754 浮動小数点丸めモードを効率的に変更するにはどうすればよいですか?

C および x86 アセンブリで IEEE 754 浮動小数点丸めモードを効率的に変更するにはどうすればよいですか?

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

How Can I Efficiently Change IEEE 754 Floating Point Rounding Modes in C and x86 Assembly?

IEEE 754 浮動小数点丸めモードの操作

浮動小数点演算では、多くの場合、真の数学的結果を近似するための数値の丸めが必要になります。 IEEE 754 標準では、浮動小数点数の丸め方法を決定するいくつかの丸めモードが定義されています。この記事では、ポータブル C または x86 アセンブリ環境で丸めモードを変更する効率的な方法について説明します。

標準 C ソリューション

ポータブル C コードの場合、ソリューションにはC99 関数 fesetround()。丸めモードを設定できます。ただし、変更後は元の丸めモードを復元することを忘れないでください。

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

int main() {
    int originalRounding = fegetround();
    fesetround(FE_TOWARDZERO);
    // Perform operations

    fesetround(originalRounding);
    return 0;
}
ログイン後にコピー

x86 Assembly Solution

C99 サポートのない古いプラットフォームで作業している場合場合によっては、丸めモードを操作するために x86 アセンブリを使用する必要があります。これには、x87 ユニット (fldcw 命令を使用) と SSE (ldmxcsr 命令を使用) の両方で丸めモードを設定することが含まれます。

MSVC 固有のソリューション

MS の場合Visual C (MSVC)、アセンブリの代替手段があります。非標準の _controlfp() 関数を使用して、丸めモードを変更できます。

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// Do some operations

_controlfp(originalRounding, _MCW_RC);
ログイン後にコピー

丸めモード定数

丸めモードを指定するには、以下を行う必要があります。適切なマクロ定数を使用してください。以下は、丸めモードの標準 C および MSVC 名の概要です:

Rounding Mode C MSVC
Nearest FE_TONEAREST _RC_NEAR
Toward Zero FE_TOWARDZERO _RC_CHOP
Positive Infinity FE_UPWARD _RC_UP
Negative Infinity FE_DOWNWARD _RC_DOWN

以上がC および x86 アセンブリで IEEE 754 浮動小数点丸めモードを効率的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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