FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
來自 cppreference.com
定義於標頭檔案 <cfenv> |
||
#define FE_DIVBYZERO /*實現定義的2的冪*/ |
(C++11 起) | |
#define FE_INEXACT /*實現定義的2的冪*/ |
(C++11 起) | |
#define FE_INVALID /*實現定義的2的冪*/ |
(C++11 起) | |
#define FE_OVERFLOW /*實現定義的2的冪*/ |
(C++11 起) | |
#define FE_UNDERFLOW /*實現定義的2的冪*/ |
(C++11 起) | |
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \ FE_INVALID | FE_OVERFLOW | \ |
(C++11 起) | |
所有這些宏常量(除了FE_ALL_EXCEPT
)都擴充套件為整數常量表達式,它們是不同的2的冪,唯一標識所有支援的浮點異常。每個宏僅在其受支援時才定義。
宏常量FE_ALL_EXCEPT
擴充套件為所有其他FE_*
的按位或,它總是被定義,如果實現不支援浮點異常,則為零。
常量 | 解釋 |
FE_DIVBYZERO
|
先前的浮點操作中發生極點錯誤 |
FE_INEXACT
|
結果不精確:為了儲存先前浮點操作的結果,需要進行舍入 |
FE_INVALID
|
先前的浮點操作中發生域錯誤 |
FE_OVERFLOW
|
先前浮點操作的結果太大,無法表示 |
FE_UNDERFLOW
|
先前浮點操作的結果為次正規數,精度有損失 |
FE_ALL_EXCEPT
|
所有支援的浮點異常的按位或 |
實現可以在<cfenv>中定義額外的宏常量來標識額外的浮點異常。所有這些常量都以FE_
開頭,後跟至少一個大寫字母。
有關更多詳細資訊,請參見math_errhandling。
[編輯] 示例
執行此程式碼
#include <cfenv> #include <cmath> #include <iostream> // #pragma STDC FENV_ACCESS ON volatile double zero = 0.0; // volatile not needed where FENV_ACCESS is supported volatile double one = 1.0; // volatile not needed where FENV_ACCESS is supported int main() { std::feclearexcept(FE_ALL_EXCEPT); std::cout << "1.0/0.0 = " << 1.0 / zero << '\n'; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "division by zero reported\n"; else std::cout << "division by zero not reported\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "1.0/10 = " << one / 10 << '\n'; if (std::fetestexcept(FE_INEXACT)) std::cout << "inexact result reported\n"; else std::cout << "inexact result not reported\n"; std::feclearexcept(FE_ALL_EXCEPT); std::cout << "sqrt(-1) = " << std::sqrt(-1) << '\n'; if (std::fetestexcept(FE_INVALID)) std::cout << "invalid result reported\n"; else std::cout << "invalid result not reported\n"; }
可能的輸出
1.0/0.0 = inf division by zero reported 1.0/10 = 0.1 inexact result reported sqrt(-1) = -nan invalid result reported
[編輯] 另請參見
(C++11)(C++11)(C++11) |
定義常用數學函式使用的錯誤處理機制 (宏常量) |
C 文件,關於浮點異常宏
|