名前空間
変種
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
(C99)(C23)
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
MATH_ERRNOMATH_ERRNOEXCEPT
(C99)(C99) 
math_errhandling
(C99)

高速演算インジケータ
 
ヘッダー <math.h> で定義
#define MATH_ERRNO        1
(C99以降)
#define MATH_ERREXCEPT    2
(C99以降)
#define math_errhandling  /*実装定義*/
(C99以降)

マクロ定数math_errhandlingは、MATH_ERRNOMATH_ERREXCEPT、またはそれらのビットごとのOR(MATH_ERRNO | MATH_ERREXCEPT)のいずれかに等しい、int 型の式に展開されます。

math_errhandlingの値は、浮動小数点演算子および関数によって実行されるエラー処理の種類を示します。

Constant 説明
MATH_ERREXCEPT 浮動小数点例外が使用されることを示します。FE_DIVBYZEROFE_INVALIDFE_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が設定されるかどうかは、一般に未指定ですが、関数の説明で明示的に指定される場合があります(例:rintnearbyint)。

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
English 日本語 中文(简体) 中文(繁體)