Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm feclearexcept trong C++ (xử lý ngoại lệ dấu chấm động)


feclearexcept() từ <cfenv> (C++11) xóa các cờ ngoại lệ dấu chấm động (floating-point exceptions). Cần bật #pragma STDC FENV_ACCESS on.

Các macro ngoại lệ phổ biến

MacroNgoại lệ
FE_DIVBYZEROChia cho 0
FE_INVALIDPhép toán vô nghĩa (sqrt(-1), 0/0)
FE_OVERFLOWKết quả quá lớn
FE_UNDERFLOWKết quả quá nhỏ (gần 0)
FE_INEXACTMất độ chính xác (làm tròn)
FE_ALL_EXCEPTTất cả các ngoại lệ trên

Ví dụ mã nguồn

#include <iostream>
#include <cfenv>
#include <cmath>
#pragma STDC FENV_ACCESS on
using namespace std;

int main() {
    // Xóa tất cả cờ
    feclearexcept(FE_ALL_EXCEPT);
    
    // Gây ra ngoại lệ
    double r = sqrt(-5.0); // FE_INVALID
    
    // Kiểm tra
    if (fetestexcept(FE_INVALID))
        cout << "sqrt(-5) gay ra FE_INVALID\n";
    
    // Xóa và thử lại
    feclearexcept(FE_INVALID);
    r = 1.0 / 0.0; // FE_DIVBYZERO
    if (fetestexcept(FE_DIVBYZERO))
        cout << "1.0/0.0 gay ra FE_DIVBYZERO\n";
    
    return 0;
}

Đầu ra

sqrt(-5) gay ra FE_INVALID
1.0/0.0 gay ra FE_DIVBYZERO

Lưu ý

  • #pragma STDC FENV_ACCESS on bắt buộc để compiler không tối ưu hóa bỏ qua kiểm tra.
  • Không phải mọi platform/compiler đều hỗ trợ đầy đủ.
  • Dùng cho kiểm soát số học chính xác, không phải exception handling C++ (try/catch).