名前空間
変種
操作

FE_DIVBYZERO、FE_INEXACT、FE_INVALID、FE_OVERFLOW、FE_UNDERFLOW、FE_ALL_EXCEPT

From cppreference.com
< cpp‎ | numeric‎ | fenv
 
 
 
浮動小数点環境
関数
(C++11)(C++11)
(C++11)(C++11)
マクロ定数
FE_ALL_EXCEPTFE_DIVBYZEROFE_INEXACTFE_INVALIDFE_OVERFLOWFE_UNDERFLOW
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
(C++11)
 
ヘッダー<cfenv>で定義
#define FE_DIVBYZERO    /*実装定義の2のべき乗*/
(C++11以降)
#define FE_INEXACT      /*実装定義の2のべき乗*/
(C++11以降)
#define FE_INVALID      /*実装定義の2のべき乗*/
(C++11以降)
#define FE_OVERFLOW     /*実装定義の2のべき乗*/
(C++11以降)
#define FE_UNDERFLOW    /*実装定義の2のべき乗*/
(C++11以降)
#define FE_ALL_EXCEPT   FE_DIVBYZERO | FE_INEXACT | \

                        FE_INVALID | FE_OVERFLOW |  \

                        FE_UNDERFLOW
(C++11以降)

これらのマクロ定数(FE_ALL_EXCEPTを除く)は、サポートされているすべての浮動小数点例外を一意に識別する、異なる2のべき乗の整数定数式に展開されます。各マクロは、サポートされている場合にのみ定義されます。

FE_ALL_EXCEPTマクロ定数は、他のすべてのFE_*のビットごとのORに展開され、常に定義されます。浮動小数点例外が実装でサポートされていない場合はゼロになります。

Constant 説明
FE_DIVBYZERO 以前の浮動小数点演算で発生した極値エラー
FE_INEXACT 不正確な結果:以前の浮動小数点演算の結果を格納するために丸めが必要でした
FE_INVALID 以前の浮動小数点演算で発生した定義域エラー
FE_OVERFLOW 以前の浮動小数点演算の結果が大きすぎて表現できませんでした
FE_UNDERFLOW 以前の浮動小数点演算の結果がサブノーマルであり、精度が失われました
FE_ALL_EXCEPT サポートされているすべての浮動小数点例外のビットごとのOR

実装は、追加の浮動小数点例外を識別するために、<cfenv>にマクロ定数を追加で定義する場合があります。そのような定数はすべて、FE_で始まり、それに少なくとも1つの大文字が続きます。

math_errhandlingを参照して、詳細を確認してください。

[編集]

#include <cfenv>
#include <cmath>
#include <iostream>
 
// #pragma STDC FENV_ACCESS ON
 
volatile double zero = 0.0; // volatile not needed where FENV_ACCESS is supported
volatile double one = 1.0;  // volatile not needed where FENV_ACCESS is supported
 
int main()
{
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout <<  "1.0/0.0 = " << 1.0 / zero << '\n';
    if (std::fetestexcept(FE_DIVBYZERO))
        std::cout << "division by zero reported\n";
    else
        std::cout << "division by zero not reported\n";
 
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "1.0/10 = " << one / 10 << '\n';
    if (std::fetestexcept(FE_INEXACT))
        std::cout << "inexact result reported\n";
    else
        std::cout << "inexact result not reported\n";
 
    std::feclearexcept(FE_ALL_EXCEPT);
    std::cout << "sqrt(-1) = " << std::sqrt(-1) << '\n';
    if (std::fetestexcept(FE_INVALID))
        std::cout << "invalid result reported\n";
    else
        std::cout << "invalid result not reported\n";
}

実行結果の例

1.0/0.0 = inf
division by zero reported
1.0/10 = 0.1
inexact result reported
sqrt(-1) = -nan
invalid result reported

[編集] 関連項目

一般的な数学関数で使用されるエラーハンドリングメカニズムを定義する
(マクロ定数) [編集]
C言語のドキュメント浮動小数点例外マクロについて)
English 日本語 中文(简体) 中文(繁體)