FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
來自 cppreference.com
定義於標頭檔案 <fenv.h> |
||
#define FE_DIVBYZERO /*實現定義的2的冪*/ |
(C99 起) | |
#define FE_INEXACT /*實現定義的2的冪*/ |
(C99 起) | |
#define FE_INVALID /*實現定義的2的冪*/ |
(C99 起) | |
#define FE_OVERFLOW /*實現定義的2的冪*/ |
(C99 起) | |
#define FE_UNDERFLOW /*實現定義的2的冪*/ |
(C99 起) | |
#define FE_ALL_EXCEPT FE_DIVBYZERO | FE_INEXACT | \ FE_INVALID | FE_OVERFLOW | \ |
(C99 起) | |
所有這些宏常量(FE_ALL_EXCEPT 除外)都擴充套件為不同的2的冪的整數常量表達式,它們唯一地標識所有支援的浮點異常。每個宏僅在其受支援時才定義。
宏常量 FE_ALL_EXCEPT 擴充套件為所有其他 FE_*
的位或,它始終被定義,如果實現不支援浮點異常,則為零。
常數 | 解釋 |
FE_DIVBYZERO
|
早期的浮點運算中發生極點錯誤 |
FE_INEXACT
|
不精確結果:儲存早期浮點運算結果時需要進行舍入 |
FE_INVALID
|
早期的浮點運算中發生域錯誤 |
FE_OVERFLOW
|
早期浮點運算的結果太大而無法表示 |
FE_UNDERFLOW
|
早期浮點運算的結果是非正常的,且精度有損失 |
FE_ALL_EXCEPT
|
所有受支援的浮點異常的位或 |
實現可以在 <fenv.h>
中定義額外的宏常量,以標識額外的浮點異常。所有此類常量都以 FE_
開頭,後跟至少一個大寫字母。
有關更多詳細資訊,請參閱 math_errhandling。
[編輯] 示例
執行此程式碼
#include <stdio.h> #include <math.h> #include <float.h> #include <fenv.h> #pragma STDC FENV_ACCESS ON void show_fe_exceptions(void) { printf("exceptions raised:"); if(fetestexcept(FE_DIVBYZERO)) printf(" FE_DIVBYZERO"); if(fetestexcept(FE_INEXACT)) printf(" FE_INEXACT"); if(fetestexcept(FE_INVALID)) printf(" FE_INVALID"); if(fetestexcept(FE_OVERFLOW)) printf(" FE_OVERFLOW"); if(fetestexcept(FE_UNDERFLOW)) printf(" FE_UNDERFLOW"); feclearexcept(FE_ALL_EXCEPT); printf("\n"); } int main(void) { printf("MATH_ERREXCEPT is %s\n", math_errhandling & MATH_ERREXCEPT ? "set" : "not set"); printf("0.0/0.0 = %f\n", 0.0/0.0); show_fe_exceptions(); printf("1.0/0.0 = %f\n", 1.0/0.0); show_fe_exceptions(); printf("1.0/10.0 = %f\n", 1.0/10.0); show_fe_exceptions(); printf("sqrt(-1) = %f\n", sqrt(-1)); show_fe_exceptions(); printf("DBL_MAX*2.0 = %f\n", DBL_MAX*2.0); show_fe_exceptions(); printf("nextafter(DBL_MIN/pow(2.0,52),0.0) = %.1f\n", nextafter(DBL_MIN/pow(2.0,52),0.0)); show_fe_exceptions(); }
可能的輸出
MATH_ERREXCEPT is set 0.0/0.0 = nan exceptions raised: FE_INVALID 1.0/0.0 = inf exceptions raised: FE_DIVBYZERO 1.0/10.0 = 0.100000 exceptions raised: FE_INEXACT sqrt(-1) = -nan exceptions raised: FE_INVALID DBL_MAX*2.0 = inf exceptions raised: FE_INEXACT FE_OVERFLOW nextafter(DBL_MIN/pow(2.0,52),0.0) = 0.0 exceptions raised: FE_INEXACT FE_UNDERFLOW