C++のfeclearexcept関数とは?浮動小数点例外をクリアする方法
C++のfeclearexcept()関数は、引数exceptsで指定された、サポートされている浮動小数点例外フラグをクリア(解除)するために使用される関数です。
この関数は、指定されたすべての例外が正常にクリアされた場合、または引数の値が0だった場合に0を返します。一方、何らかの理由で例外をクリアできなかった場合には0以外の値を返します。
なお、feclearexcept()を使用するには、事前にFENV_ACCESSを有効にしておく必要があります。これにより、プログラムから浮動小数点環境へアクセスできるようになり、発生した例外をテスト・操作することが可能になります。
使用例
以下のコードでは、すべての例外フラグをクリアした後、負の数に対して平方根を求め、無効演算例外(FE_INVALID)が発生したかどうかを確認しています。
#include <fenv.h>
#include <iostream>
#include <cmath>
#pragma STDC FENV_ACCESS on
using namespace std;
int main() {
// すべての浮動小数点例外フラグをクリア
feclearexcept(FE_ALL_EXCEPT);
// 負の数の平方根を計算(無効演算が発生)
sqrt(-5);
// FE_INVALIDが発生したかどうかをチェック
if (fetestexcept(FE_INVALID))
cout << "sqrt(-5) will generate FE_INVALID" << endl;
}実行結果
sqrt(-5) will generate FE_INVALID
コードの解説
まずfeclearexcept(FE_ALL_EXCEPT)を呼び出すことで、すべての浮動小数点例外フラグを初期状態にリセットしています。次にsqrt(-5)を実行すると、負の数の平方根という数学的に定義されない演算が行われ、無効演算例外FE_INVALIDが発生します。最後にfetestexcept()を使ってFE_INVALIDフラグが立っているかどうかを判定し、例外の発生を検出しています。
このように、feclearexcept()は前回の演算で残った例外フラグを消去し、新しい演算による例外だけを正確に検出したい場合に役立ちます。
-
C++で解く「迷路 II」問題 ― 壁に当たるまで転がるボールの最短距離をBFSで求める
問題概要 空きマスと壁からなる迷路の中にボールがあります。ボールは上・下・左・右のいずれかの方向に転がって空きマスを進むことができますが、壁にぶつかるまで止まることはできません。ボールが停止したときに、初めて次の方向を選ぶことができます。 ボールのスタート位置、目的地、そして迷路そのものが与えられるので、ボールが目的地で停止するまでの最短距離を求めてください。ここでの距離とは、ボールが転がって通過した空きマスの数のことです(スタート位置は含まず、目的地は含みます)。どうしても目的地で停止できない場合は -1 を返します。 迷路は2次元配列で表現されます。1 が壁、0 が空きスペースを意味し、迷
-
C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法
迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0