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

印刷ビューの終了

更新: 2015 年 1 月
 
 

4.3.2 C99 例外フラグ関数

C/C++ プログラムでは、C99 浮動小数点環境関数を使用して、浮動小数点の例外フラグをテスト、設定、およびクリアできます。ヘッダーファイル fenv.h は、5 つの標準例外 (FE_INEXACTFE_UNDERFLOWFE_OVERFLOWFE_DIVBYZERO、および FE_INVALID) に対応する 5 つのマクロを定義しています。fenv.h は、マクロ FE_ALL_EXCEPT が 5 つの例外マクロすべてのビット単位の「or」となるようにも定義しています。これらのマクロを組み合わせることにより、例外フラグの任意のサブセットのテストやクリアを行なったり、例外の任意の組み合わせを発生させたりできます。次に、これらのマクロを C99 浮動小数点環境関数のいくつかと合わせて使用した例を示します。詳細は、feclearexcept(3M) のマニュアルページを参照してください。


注 -  一貫した動作を保つため、libm の C99 浮動小数点環境関数と拡張機能、および libsunmathieee_flags 関数と ieee_handler 関数の両方を同じプログラム内で使用しないでください。

5 つの例外フラグすべてをクリアするには、次を使用します。

feclearexcept(FE_ALL_EXCEPT);

無効な演算フラグまたは 0 による除算フラグが発生したかどうかをテストするには、次を使用します。

int i;

i = fetestexcept(FE_INVALID | FE_DIVBYZERO);
if (i & FE_INVALID)
    /* invalid flag was raised */
else if (i & FE_DIVBYZERO)
    /* division-by-zero flag was raised */

fegetexceptflag 関数および fesetexceptflag 関数は、フラグのサブセットを保存および復元する方法を提供しています。次の例は、これらの 2 つの関数を使用する 1 つの方法を示しています。

fexcept_t flags;
 
/* save the underflow, overflow, and inexact flags */
fegetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* clear these flags */
feclearexcept(FE_UNDERFLOW | FE_OVERFLOW | FE_INEXACT);
/* do a computation that can underflow or overflow */
...
/* check for underflow or overflow */
if (fetestexcept(FE_UNDERFLOW | FE_OVERFLOW) != 0) {
    ...
}
/* restore the underflow, overflow, and inexact flags */
fesetexceptflag(&flags, FE_UNDERFLOW | FE_OVERFLOW, | FE_INEXACT);