最終更新日時:
が更新

履歴 編集

function
<cfenv>

std::fesetexceptflag(C++11)

namespace std {
  int fesetexceptflag(const fexcept_t *flagp, int excepts);
}

概要

浮動小数点例外を発生させずに、浮動小数点例外の状態を設定する。

効果

flagpが指す浮動小数点例外の状態のうち、exceptsで指定された種類の浮動小数点例外のみを、現在の浮動小数点例外の状態として設定する。

この関数は、浮動小数点例外を発生させない。

戻り値

  • excepts0であった場合、この関数は0を返す
  • 指定された浮動小数点例外を正しく設定できた場合、この関数は0を返す
  • それ以外の場合、この関数は0以外を返す

#include <cassert>
#include <cfenv>

int main()
{
  // ゼロ割りを発生させる
  float result = 1.0f / 0.0f;

  // 現在の浮動小数点例外の状態を取得
  std::fexcept_t excepts = 0;
  std::fegetexceptflag(&excepts, FE_ALL_EXCEPT);

  int div_by_zero_state = std::fetestexcept(FE_DIVBYZERO);

  // 浮動小数点例外の状態を変更する
  std::feclearexcept(FE_ALL_EXCEPT);
  assert(std::fetestexcept(FE_DIVBYZERO) == 0);

  // 保持しておいた浮動小数点例外の状態のうち、
  // ゼロ除算の状態のみを復旧させる
  std::fesetexceptflag(&excepts, FE_DIVBYZERO);
  assert(div_by_zero_state == std::fetestexcept(FE_DIVBYZERO));
}

出力

バージョン

言語

  • C++11

処理系

  • Clang, C++11 mode: 3.0
  • GCC, C++11 mode: 4.3.0
  • ICC: ??
  • Visual C++: 12.0, 14.0
    • コンパイルオプション/fp:strictまたは#pragma fenv_access (on)が必要。さもなくば、正しく動作しないおそれがある。