名前空間
変種
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

From cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
(C++11)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数関数
(C++11)
(C++11)

(C++11)
(C++11)
べき乗関数
(C++11)
(C++11)
三角関数と
双曲線関数
(C++11)
(C++11)
(C++11)

誤差関数とガンマ関数
(C++11)
(C++11)
(C++11)
(C++11)
最近接整数への浮動小数点数操作
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮動小数点数の操作関数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分類と比較
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
マクロ定数
math_errhandlingMATH_ERRNOMATH_ERREXCEPT
(C++11)  
(C++11)
(C++11)
分類
(C++11)(C++11)(C++11)(C++11)(C++11)


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