浮動小数点丸め動作の移植可能な調整
IEEE 754 丸めモードを変更する必要性は、さまざまなシナリオで発生します。この記事では、移植可能な C と x86 アセンブリ言語を使用した両方で、これを実現する効率的な方法を説明します。
C ソリューション
C99 は、丸めモードを操作するための包括的なソリューションを提供します。
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Preserve the initial rounding mode const int roundingMode = fegetround(); // Set the desired rounding mode (towards zero) fesetround(FE_TOWARDZERO); // Perform floating-point operations... // Revert to the original rounding mode fesetround(roundingMode); return 0; }
x86 アセンブリ解決策
C99 をサポートしていないプラットフォームでは、x86 アセンブリが代替手段を提供します:
x87 浮動小数点ユニット: fldcw を使用して丸めモードを調整します。
SSE ユニット: ldmxcsr を使用して、 SIMD 丸めモードを構成します。
MSVC 固有のソリューション
Microsoft Visual C には、非標準の _controlfp() 関数が用意されています。
unsigned int roundingMode = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // ... _controlfp(roundingMode, _MCW_RC);
丸めモード定数
以下表は、丸めモード定数のリファレンスを提供します:
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Positive Infinity | FE_UPWARD | _RC_UP |
Negative Infinity | FE_DOWNWARD | _RC_DOWN |
以上がC およびアセンブリで浮動小数点の丸め動作を移植可能に調整するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。