fenv.h ファイルは、例外フラグ、丸め制御モード、例外処理モード、SPARC 上の非標準モードなどの、浮動小数点環境全体を表すデータ型 fenv_t を定義します。以降の説明で、envp パラメータは、型 fenv_t のオブジェクトへのポインタである必要があります。
C99 では、浮動小数点環境を操作するための 4 つの関数が定義されています。libm は、マルチスレッドプログラムで役立つ場合がある追加の関数を提供します。次の表に、これらの関数の要約を示します。
|
fegetenv および fesetenv 関数はそれぞれ、浮動小数点環境を保存および復元します。fesetenv への引数には、fegetenv または feholdexcept の呼び出しで以前に保存された環境へのポインタか、あるいは fenv.h で定義されている定数 FE_DFL_ENV のどちらかを指定できます。後者は、デフォルトの環境を表します。この環境では、すべての例外フラグがクリアされ、丸めがもっとも近い値に、また x86 ベースのシステム上では拡張倍精度に設定され、無停止例外処理モード (つまり、トラップが無効) と非標準モードが無効になっています。
feholdexcept 関数は現在の環境を保存してから、すべての例外フラグをクリアし、すべての例外に対して無停止例外処理モードを確立します。feupdateenv 関数は保存された環境 (これは、fegetenv または feholdexcept の呼び出しで保存された環境、あるいは定数 FE_DFL_ENV のどちらかです) を復元してから、以前の環境でフラグが設定されていた例外を発生させます。復元された環境で、これらの例外のいずれかに対してトラップが有効になっている場合はトラップが発生し、そうでない場合はフラグが設定されます。これらの 2 つの関数を組み合わせて使用すると、次のコーディング例に示すように、サブルーチン呼び出しを例外に関して不可分な動作に見せることができます。
#include <fenv.h> void myfunc(...) { fenv_t env; /* save the environment, clear flags, and disable traps */ feholdexcept(&env); /* do a computation that may incur exceptions */ ... /* check for spurious exceptions */ if (fetestexcept(...)) { /* handle them appropriately and clear their flags */ ... feclearexcept(...); } /* restore the environment and raise relevant exceptions */ feupdateenv(&env); }
fex_merge_flags 関数は、保存された環境から現在の環境への例外フラグの論理的な OR を、どのトラップも発生させることなく実行します。この関数をマルチスレッドプログラムで使用すると、子スレッドで計算によって設定されたフラグに関する親スレッド内の情報を保持できます。fex_merge_flags の使用を示す例については、Appendix A, 例を参照してください。