首頁 >後端開發 >C++ >如何有效控制 C 和 x86 彙編中的浮點舍入模式?

如何有效控制 C 和 x86 彙編中的浮點舍入模式?

Barbara Streisand
Barbara Streisand原創
2024-11-27 12:41:14368瀏覽

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