MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
提供: cppreference.com
ヘッダ <cmath> で定義
|
||
#define MATH_ERRNO 1 |
(C++11以上) | |
#define MATH_ERREXCEPT 2 |
(C++11以上) | |
#define math_errhandling /*implementation defined*/ |
(C++11以上) | |
マクロ定数 math_errhandling
は、 MATH_ERRNO
または MATH_ERREXCEPT
またはこれらのビット単位の論理和 MATH_ERRNO | MATH_ERREXCEPT に��しい int 型の式に展開されます。
math_errhandling
の値は浮動小数点演算子および数学関数が行うエラー処理の種類を表します。
定数 | 説明 |
MATH_ERREXCEPT
|
浮動小数点例外が使用されることを表します。 少なくとも FE_DIVBYZERO, FE_INVALID, FE_OVERFLOW が <cfenv> で定義されます。 |
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 や std::nearbyint など)。
C++11 以前では浮動小数点例外は規定されておらず、あらゆる定義域エラーに対しては EDOM が要求され、オーバーフローに対しては ERANGE が要求され、アンダーフローに対しては処理系定義でした。
[編集] 例
Run this code
#include <iostream> #include <cfenv> #include <cmath> #include <cerrno> #include <cstring> #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 互換のスレッドローカルなエラー番号変数に展開されるマクロ (マクロ変数) | |
math_errhandling の C言語リファレンス
|