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 サイトの他の関連記事を参照してください。