MATH_ERRNO, MATH_ERREXCEPT, math_errhandling
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
ヘッダーで定義
<math.h>
|
||
|
#define MATH_ERRNO 1
|
(C99以降) | |
|
#define MATH_ERREXCEPT 2
|
(C99以降) | |
|
#define math_errhandling /*implementation defined*/
|
(C99以降) | |
マクロ定数
math_errhandling
は
int
型の式に展開され、その値は
MATH_ERRNO
と等しいか、
MATH_ERREXCEPT
と等しいか、またはそれらのビット単位の論理和(
MATH_ERRNO
|
MATH_ERREXCEPT
)と等しくなります。
math_errhandling
の値は、浮動小数点演算子および
関数
によって実行されるエラー処理のタイプを示します:
| 定数 | 説明 |
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++ documentation
for
math_errhandling
|
|