Oracle® Solaris Studio 12.4: 数値計算ガイド

印刷ビューの終了

更新: 2015 年 1 月
 
 

3.5.1 例外フラグ関数

fenv.h ファイルは、 FE_INEXACTFE_UNDERFLOWFE_OVERFLOWFE_DIVBYZEROFE_INVALID という 5 つの各 IEEE 浮動小数点例外フラグのためのマクロを定義します。さらに、マクロ FE_ALL_EXCEPT は、5 つのすべてのフラグマクロのビット単位の「or」として定義されています。以降の説明で、excepts パラメータは、5 つのいずれかのフラグマクロのビット単位の「or」か、または値 FE_ALL_EXCEPT のどちらかです。fegetexceptflag および fesetexceptflag 関数の場合、flagp パラメータは、型 fexcept_t のオブジェクトへのポインタである必要があります。この型は、fenv.h で定義されています。

C99 では、次の表にある例外フラグ関数が定義されています。

表 3-15  C99 規格の例外フラグ関数
関数
処理
feclearexcept(excepts)
指定されたフラグをクリアする
fetestexcept(excepts)
指定されたフラグの設定を返す
feraiseexcept(excepts)
指定された例外を発生させる
fegetexceptflag(flagp, excepts)
指定されたフラグを *flagp に保存する
fesetexceptflag(flagp, excepts)
指定されたフラグを *flagp から復元する

feclearexcept 関数は、指定されたフラグをクリアします。fetestexcept 関数は、設定されている excepts 引数によって指定されたフラグのサブセットに対応するマクロ値のビット単位の「or」を返します。たとえば、不正確、アンダーフロー、および 0 による除算のフラグだけが現在設定されている場合は、次の式によって iFE_DIVBYZERO に設定されます。

i = fetestexcept(FE_INVALID | FE_DIVBYZERO);

feraiseexcept 関数は、指定された例外のトラップのいずれかが有効になっている場合はトラップを発生させます。それ以外の場合は、単に対応するフラグを設定します。例外トラップの詳細は、Chapter 4, 例外と例外処理を参照してください。

fegetexceptflag および fesetexceptflag 関数は、特定のフラグの状態を一時的に保存し、あとで復元するための便利な方法を提供します。特に、fesetexceptflag 関数はトラップを発生させず、単に指定されたフラグの値を復元します。