FE_DIVBYZERO、FE_INEXACT、FE_INVALID、FE_OVERFLOW、FE_UNDERFLOW、FE_ALL_EXCEPT
From 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_*のビットごとのORに展開され、常に定義されます。浮動小数点例外が実装でサポートされていない場合はゼロになります。
| Constant | 説明 |
FE_DIVBYZERO
|
以前の浮動小数点演算で発生した極値エラー |
FE_INEXACT
|
不正確な結果:以前の浮動小数点演算の結果を格納するために丸めが必要でした |
FE_INVALID
|
以前の浮動小数点演算で発生した定義域エラー |
FE_OVERFLOW
|
以前の浮動小数点演算の結果が大きすぎて表現できませんでした |
FE_UNDERFLOW
|
以前の浮動小数点演算の結果がサブノーマルであり、精度が失われました |
FE_ALL_EXCEPT
|
サポートされているすべての浮動小数点例外のビットごとのOR |
実装は、追加の浮動小数点例外を識別するために、<cfenv>にマクロ定数を追加で定義する場合があります。そのような定数はすべて、FE_で始まり、それに少なくとも1つの大文字が続きます。
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言語のドキュメント(浮動小数点例外マクロについて)
| |