Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Melaraskan Gelagat Pembundaran Titik Terapung dengan Mudah Alih dalam C dan Himpunan?

Bagaimanakah Saya Boleh Melaraskan Gelagat Pembundaran Titik Terapung dengan Mudah Alih dalam C dan Himpunan?

Linda Hamilton
Lepaskan: 2024-11-24 17:34:16
asal
955 orang telah melayarinya

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

Melaraskan Gelagat Pembundaran Titik Terapung Secara Mudah Alih

Keperluan untuk mengubah suai mod pembundaran IEEE 754 timbul dalam pelbagai senario. Artikel ini menerangkan kaedah yang cekap untuk mencapai matlamat ini, dalam kedua-dua C mudah alih dan menggunakan bahasa himpunan x86.

C Solution

C99 menyediakan penyelesaian komprehensif untuk memanipulasi mod pembundaran:

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

Perhimpunan x86 Penyelesaian

Pada platform yang tidak menyokong C99, pemasangan x86 menawarkan alternatif:

Unit Titik Terapung x87: Gunakan fldcw untuk melaraskan mod pembundaran.

Unit SSE: Gunakan ldmxcsr untuk konfigurasikan mod pembundaran SIMD.

Penyelesaian Khusus MSVC

Microsoft Visual C menyediakan fungsi _controlfp() bukan standard:

unsigned int roundingMode = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);

// ...

_controlfp(roundingMode, _MCW_RC);
Salin selepas log masuk

Pemalar Mod Pembundaran

Jadual berikut menyediakan rujukan untuk pemalar mod pembundaran:

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

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaraskan Gelagat Pembundaran Titik Terapung dengan Mudah Alih dalam C dan Himpunan?. 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