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

Bagaimanakah Saya Boleh Mengubah Mod Pembundaran Titik Terapung IEEE 754 dengan Cekap dalam Himpunan C dan x86?

Barbara Streisand
Barbara Streisandasal
2024-11-29 14:45:12118semak imbas

How Can I Efficiently Change IEEE 754 Floating Point Rounding Modes in C and x86 Assembly?

Memanipulasi IEEE 754 Mod Pembundaran Titik Terapung

Aritmetik titik terapung selalunya melibatkan pembundaran nombor untuk menganggarkan hasil matematik sebenar. Piawaian IEEE 754 mentakrifkan beberapa mod pembundaran yang menentukan cara nombor titik terapung dibundarkan. Artikel ini meneroka kaedah yang cekap untuk menukar mod pembundaran dalam persekitaran pemasangan C atau x86 mudah alih.

Penyelesaian Standard C

Untuk kod C mudah alih, penyelesaiannya melibatkan penggunaan Fungsi C99 fesetround(), yang membolehkan anda menetapkan mod pembundaran. Walau bagaimanapun, anda harus ingat untuk memulihkan mod pembundaran asal selepas mengubah suainya.

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

int main() {
    int originalRounding = fegetround();
    fesetround(FE_TOWARDZERO);
    // Perform operations

    fesetround(originalRounding);
    return 0;
}

x86 Assembly Solution

Jika anda bekerja pada platform lama tanpa sokongan C99 , anda mungkin perlu menggunakan pemasangan x86 untuk memanipulasi mod pembundaran. Ini melibatkan penetapan mod pembundaran dalam kedua-dua unit x87 (menggunakan arahan fldcw) dan SSE (menggunakan arahan ldmxcsr).

Penyelesaian Khusus MSVC

Untuk MS Visual C (MSVC), terdapat alternatif kepada pemasangan. Anda boleh menggunakan fungsi _controlfp() bukan standard untuk menukar mod pembundaran.

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// Do some operations

_controlfp(originalRounding, _MCW_RC);

Pemalar Mod Pembulatan

Untuk menentukan mod pembundaran, anda perlu gunakan pemalar makro yang sesuai. Berikut ialah ringkasan nama C dan MSVC standard untuk mod pembundaran:

Rounding Mode C MSVC
Nearest FE_TONEAREST _RC_NEAR
Toward Zero FE_TOWARDZERO _RC_CHOP
Positive Infinity FE_UPWARD _RC_UP
Negative Infinity FE_DOWNWARD _RC_DOWN

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengubah Mod Pembundaran Titik Terapung IEEE 754 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