名前空間
変種
操作

MATH_ERRNO, MATH_ERREXCEPT, math_errhandling

提供: 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)
math_errhandlingMATH_ERRNOMATH_ERREXCEPT
(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  /*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_MIN/2
不正確な結果 結果の値を結果の型に収めるために丸める必要がある場合 無変更 FE_INEXACT または無し (未規定) std::sqrt(2), 1.0/10.0

[編集] ノート

数学ライブラリの関数によって FE_INEXACT が発生するか否かは一般的には未規定ですが、各関数の説明で明示的に規定されている場合もあります (std::rintstd::nearbyint など)。

C++11 以前では浮動小数点例外は規定されておらず、あらゆる定義域エラーに対しては EDOM が要求され、オーバーフローに対しては ERANGE が要求され、アンダーフローに対しては処理系定義でした。

[編集]

#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

[編集] 関連項目

浮動小数点例外
(マクロ定数) [edit]
POSIX 互換のスレッドローカルなエラー番号変数に展開されるマクロ
(マクロ変数) [edit]
math_errhandlingC言語リファレンス