可移植地调整浮点舍入行为
在各种情况下都会出现修改 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中文网其他相关文章!