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