首頁 >後端開發 >C++ >如何在 C 語言和組合語言中可移植地調整浮點舍入行為?

如何在 C 語言和組合語言中可移植地調整浮點舍入行為?

Linda Hamilton
Linda Hamilton原創
2024-11-24 17:34:16912瀏覽

How Can I Portably Adjust Floating-Point Rounding Behavior in C and Assembly?

可移植地調整浮點舍入行為

在各種情況下都會出現修改 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn