Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Kawal Mod Pembundaran Titik Terapung dengan Cekap dalam Himpunan C dan x86?

Bagaimanakah Saya Boleh Kawal Mod Pembundaran Titik Terapung dengan Cekap dalam Himpunan C dan x86?

Barbara Streisand
Barbara Streisandasal
2024-11-27 12:41:14439semak imbas

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

Mengubah suai Pembundaran Titik Terapung dengan Cekap dalam Himpunan C dan x86

Nombor titik terapung IEEE 754 menawarkan pelbagai mod pembundaran, seperti terdekat, sifar, infiniti positif, dan infiniti negatif. Mengubah suai mod pembundaran membolehkan kawalan tepat ke atas perwakilan perpuluhan hasil.

C Solution

Pustaka standard C menyediakan penyelesaian mudah alih untuk mengubah mod pembundaran melalui fesetround( ) fungsi:

#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 Perhimpunan Penyelesaian

Untuk platform tanpa sokongan C99, pemasangan x86 boleh digunakan untuk mengubah suai kedua-dua unit x87 dan mod pembundaran 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 menawarkan fungsi _controlfp() bukan standard untuk ini tujuan:

#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;
}

Gelang Dekoder Mod Pembundaran

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Kawal Mod Pembundaran Titik Terapung dengan Cekap dalam Himpunan C dan x86?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn