可移植地調整浮點舍入行為
在各種情況下都會出現修改 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舍入模式
x87浮點單元:使用fldcw舍入模式。
SSE 單元:使用 ldmxcsr 進行設定SIMD 舍入模式。
MSVC 特定解unsigned int roundingMode = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // ... _controlfp(roundingMode, _MCW_RC);Microsoft Visual C 提供非標準 _controlfp() 函數:
舍入模式常數
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中文網其他相關文章!