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
| Macro | Ngoại lệ |
|---|---|
| FE_DIVBYZERO | Chia cho 0 |
| FE_INVALID | Phép toán vô nghĩa (sqrt(-1), 0/0) |
| FE_OVERFLOW | Kết quả quá lớn |
| FE_UNDERFLOW | Kết quả quá nhỏ (gần 0) |
| FE_INEXACT | Mất độ chính xác (làm tròn) |
| FE_ALL_EXCEPT | Tấ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 onbắ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).