高效修改 C 和 x86 汇编中的浮点舍入
IEEE 754 浮点数提供各种舍入模式,例如最接近、零、正无穷大和负无穷大。修改舍入模式可以精确控制结果的小数表示形式。
C 解决方案
C 标准库提供了一个可移植的解决方案,用于通过 fesetround( ) 函数:
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Save the original rounding mode int originalRounding = fegetround(); // Set the desired rounding mode (e.g., to zero) fesetround(FE_TOWARDZERO); // Perform operations with the adjusted rounding mode // Restore the original rounding mode fesetround(originalRounding); return 0; }
x86 汇编解决方案
对于不支持C99的平台,可以使用x86汇编来修改x87单位和SSE舍入模式:
; x87 unit fldcw [new rounding mode] ; e.g., FNINIT to nearest ; SSE ldmxcsr [new rounding mode] ; e.g., MXCSR_RND_NEAREST
Microsoft Visual C
MSVC 为此提供了非标准 _controlfp() 函数目的:
#include <math.h> int main() { // Save the original rounding mode unsigned int originalRounding = _controlfp(0, 0); // Set the desired rounding mode (e.g., to zero) _controlfp(_RC_CHOP, _MCW_RC); // Perform operations with the adjusted rounding mode // Restore the original rounding mode _controlfp(originalRounding, _MCW_RC); return 0; }
舍入模式解码器环
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Zero | FE_TOWARDZERO | _RC_CHOP |
Infinity | FE_UPWARD | _RC_UP |
-Infinity | FE_DOWNWARD | _RC_DOWN |
以上是如何有效控制 C 和 x86 汇编中的浮点舍入模式?的详细内容。更多信息请关注PHP中文网其他相关文章!