MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
From cppreference.com
| ヘッダー <math.h> で定義 |
||
| #define MATH_ERRNO 1 |
(C99以降) | |
| #define MATH_ERREXCEPT 2 |
(C99以降) | |
| #define math_errhandling /*実装定義*/ |
(C99以降) | |
マクロ定数math_errhandlingは、MATH_ERRNO、MATH_ERREXCEPT、またはそれらのビットごとのOR(MATH_ERRNO | MATH_ERREXCEPT)のいずれかに等しい、int 型の式に展開されます。
math_errhandlingの値は、浮動小数点演算子および関数によって実行されるエラー処理の種類を示します。
| Constant | 説明 |
MATH_ERREXCEPT
|
浮動小数点例外が使用されることを示します。FE_DIVBYZERO、FE_INVALID、FE_OVERFLOW が<fenv.h>で定義されていることが少なくとも保証されています。 |
MATH_ERRNO
|
浮動小数点演算がエラーを報告するために変数errnoを使用することを示します。 |
実装がIEEE浮動小数点演算(IEC 60559)をサポートしている場合、math_errhandling & MATH_ERREXCEPT がゼロ以外であることが要求されます。
以下の浮動小数点エラー条件が認識されます。
| 条件 | 説明 | errno | 浮動小数点例外 | 例 |
|---|---|---|---|---|
| ドメインエラー | 引数が、操作が数学的に定義されている範囲外にある(各関数の説明に必要なドメインエラーがリストされています) | EDOM | FE_INVALID | acos(2) |
| 極値エラー | 関数の数学的な結果が正確に無限大または未定義である | ERANGE | FE_DIVBYZERO | log(0.0)、1.0/0.0 |
| オーバーフローによる範囲エラー | 数学的な結果は有限だが、丸め後に無限大になる、または丸めダウン後に表現可能な最大の有限値になる | ERANGE | FE_OVERFLOW | pow(DBL_MAX,2) |
| アンダーフローによる範囲エラー | 結果はゼロではないが、丸め後にゼロになる、または精度低下を伴う非正規数になる | ERANGEまたは未変更(実装定義) | FE_UNDERFLOWまたはなし(実装定義) | DBL_TRUE_MIN/2 |
| 不正確な結果 | 結果が宛先型に収まるように丸める必要がある | 未変更 | FE_INEXACTまたはなし(未指定) | sqrt(2)、1.0/10.0 |
目次 |
[編集] 注釈
数学ライブラリ関数によってFE_INEXACTが設定されるかどうかは、一般に未指定ですが、関数の説明で明示的に指定される場合があります(例:rintとnearbyint)。
C99より前は、浮動小数点例外は指定されておらず、ドメインエラーにはEDOMが、オーバーフローにはERANGEが要求され、アンダーフローについては実装定義でした。
[編集] 例
このコードを実行
#include <stdio.h> #include <fenv.h> #include <math.h> #include <errno.h> #pragma STDC FENV_ACCESS ON int main(void) { printf("MATH_ERRNO is %s\n", math_errhandling & MATH_ERRNO ? "set" : "not set"); printf("MATH_ERREXCEPT is %s\n", math_errhandling & MATH_ERREXCEPT ? "set" : "not set"); feclearexcept(FE_ALL_EXCEPT); errno = 0; printf("log(0) = %f\n", log(0)); if(errno == ERANGE) perror("errno == ERANGE"); if(fetestexcept(FE_DIVBYZERO)) puts("FE_DIVBYZERO (pole error) reported"); }
実行結果の例
MATH_ERRNO is set MATH_ERREXCEPT is set log(0) = -inf errno = ERANGE: Numerical result out of range FE_DIVBYZERO (pole error) reported
[編集] 参照
- C17標準 (ISO/IEC 9899:2018)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 170)
- F.10/4 MATH_ERREXCEPT, math_errhandling (p: 377)
- C11標準 (ISO/IEC 9899:2011)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 233)
- F.10/4 MATH_ERREXCEPT, math_errhandling (p: 517)
- C99標準 (ISO/IEC 9899:1999)
- 7.12/9 MATH_ERRNO, MATH_ERREXCEPT, math_errhandling (p: 214)
- F.9/4 MATH_ERREXCEPT, math_errhandling> (p: 454)
[編集] 関連項目
| 浮動小数点例外 (マクロ定数) | |
| POSIX互換のスレッドローカルなエラー番号変数に展開されるマクロ (マクロ変数) | |
| C++ ドキュメント math_errhandling
| |