FE_DIVBYZERO, FE_INEXACT, FE_INVALID, FE_OVERFLOW, FE_UNDERFLOW, FE_ALL_EXCEPT
From cppreference.net
|
ヘッダーで定義
<fenv.h>
|
||
|
#define FE_DIVBYZERO /*implementation defined power of 2*/
|
(C99以降) | |
|
#define FE_INEXACT /*implementation defined power of 2*/
|
(C99以降) | |
|
#define FE_INVALID /*implementation defined power of 2*/
|
(C99以降) | |
|
#define FE_OVERFLOW /*implementation defined power of 2*/
|
(C99以降) | |
|
#define FE_UNDERFLOW /*implementation defined power of 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_
で始まり、その後少なくとも1つの大文字が続く。
詳細については 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
参考文献
- C11標準 (ISO/IEC 9899:2011):
-
- 7.6/6 浮動小数点環境 <fenv.h> (p: 207)
- C99標準 (ISO/IEC 9899:1999):
-
- 7.6/5 浮動小数点環境 <fenv.h> (p: 188)
関連項目
|
(C99)
(C99)
(C99)
|
一般的な数学関数で使用されるエラー処理メカニズムを定義する
(マクロ定数) |
|
C++ドキュメント
for
浮動小数点例外マクロ
|
|