MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
From cppreference.com
| ヘッダー <cmath> で定義 |
||
| #define MATH_ERRNO 1 |
(C++11以降) | |
| #define MATH_ERREXCEPT 2 |
(C++11以降) | |
| #define math_errhandling /*実装定義*/ |
(C++11以降) | |
マクロ定数math_errhandlingは、MATH_ERRNOに等しいか、MATH_ERREXCEPTに等しいか、それらのビットごとのOR(MATH_ERRNO | MATH_ERREXCEPT)に等しい、int型の式に展開されます。
math_errhandlingの値は、浮動小数点演算子および関数によって実行されるエラー処理の種類を示します。
| Constant | 説明 |
MATH_ERREXCEPT
|
浮動小数点例外が使用されることを示します。<cfenv>には、少なくともFE_DIVBYZERO、FE_INVALID、およびFE_OVERFLOWが定義されています。 |
MATH_ERRNO
|
浮動小数点演算がエラーを報告するために変数errnoを使用することを示します。 |
実装がIEEE浮動小数点演算(IEC 60559)をサポートしている場合、math_errhandling & MATH_ERREXCEPTは非ゼロである必要があります。
以下の浮動小数点エラー条件が認識されます。
| 条件 | 説明 | errno | 浮動小数点例外 | 例 |
|---|---|---|---|---|
| ドメインエラー | 引数が、演算が数学的に定義されている範囲外である場合(各関数の説明に、必要なドメインエラーがリストされています) | EDOM | FE_INVALID | std::acos(2) |
| 極エラー | 関数の数学的な結果が正確に無限大または未定義である場合 | ERANGE | FE_DIVBYZERO | std::log(0.0), 1.0 / 0.0 |
| オーバーフローによる範囲エラー | 数学的な結果は有限だが、丸め後に無限大になるか、切り捨て後に表現可能な最大の有限値になる場合 | ERANGE | FE_OVERFLOW | std::pow(DBL_MAX, 2) |
| アンダーフローによる範囲エラー | 結果は非ゼロだが、丸め後にゼロになるか、精度が失われて非正規化数になる場合 | ERANGE または変更なし(実装定義) | FE_UNDERFLOW または何もなし(実装定義) | DBL_TRUE_MIN / 2 |
| 不正確な結果 | 結果が宛先型に収まるように丸める必要がある場合 | 変更なし | FE_INEXACT または何もなし(未指定) | std::sqrt(2), 1.0 / 10.0 |
[編集] 備考
数学ライブラリ関数によってFE_INEXACTが設定されるかどうかは一般に未指定ですが、関数の説明で明示的に指定される場合があります(例:std::rint vs std::nearbyint)。
C++11より前では、浮動小数点例外は指定されておらず、すべてのドメインエラーに対してEDOMが必須であり、オーバーフローに対してERANGEが必須であり、アンダーフローに対しては実装定義でした。
[編集] 例
このコードを実行
#include <cerrno> #include <cfenv> #include <cmath> #include <cstring> #include <iostream> // #pragma STDC FENV_ACCESS ON int main() { std::cout << "MATH_ERRNO is " << (math_errhandling & MATH_ERRNO ? "set" : "not set") << '\n' << "MATH_ERREXCEPT is " << (math_errhandling & MATH_ERREXCEPT ? "set" : "not set") << '\n'; std::feclearexcept(FE_ALL_EXCEPT); errno = 0; std::cout << "log(0) = " << std::log(0) << '\n'; if (errno == ERANGE) std::cout << "errno = ERANGE (" << std::strerror(errno) << ")\n"; if (std::fetestexcept(FE_DIVBYZERO)) std::cout << "FE_DIVBYZERO (pole error) reported\n"; }
実行結果の例
MATH_ERRNO is set MATH_ERREXCEPT is set log(0) = -inf errno = ERANGE (Numerical result out of range) FE_DIVBYZERO (pole error) reported
[編集] 関連項目
| 浮動小数点例外 (マクロ定数) | |
| POSIX互換のスレッドローカルなエラー番号変数に展開されるマクロ (マクロ変数) | |
| Cドキュメント(math_errhandling)
| |