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
Lepaskan: 2024-11-27 12:41:14
asal
403 orang telah melayarinya

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan