首页 >后端开发 >C++ >如何有效控制 C 和 x86 汇编中的浮点舍入模式?

如何有效控制 C 和 x86 汇编中的浮点舍入模式?

Barbara Streisand
Barbara Streisand原创
2024-11-27 12:41:14370浏览

How Can I Efficiently Control Floating-Point Rounding Modes in C and x86 Assembly?

高效修改 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn