# マニュアルページ fegetenv.3m

## 名前

         fegetenv,     fesetenv,      feholdexcept,      feupdateenv,
         fex_merge_flags - 浮動小数点環境の管理

## 形式

         cc   [   flag   ...   ]   file   ...     -R/opt/SUNWspro/lib
         -L/opt/SUNWspro/lib -lm9x [ library ... ]

         #include <fenv.h>

         void fegetenv(fenv_t *envp);

         void fesetenv(const fenv_t *envp);

         int feholdexcept(fenv_t *envp);

         void feupdateenv(const fenv_t *envp);

         void fex_merge_flags(const fenv_t *envp);

         #include <fenv96.h>

         int feholdexcept96(fenv_t *envp);

## 機能説明

         これらの関数は浮動小数点環境を管理します。つまり、例外 フ ラ
         グ、丸め方向モード、および、例外処理モードを単一の言語要素と
         して構成します。SPARC システムでは、浮動小数点環境は規格以外
         の算術モードも含みます。Intel システムでは、浮動小数点環境は
         丸め精度モードを含みます。

         fegetenv(envp) は、現在の浮動小数点環境を envp が指 す オ ブ
         ジェクトに保存します。型 fenv_t は <fenv.h> に定義されていま
         す。

         fesetenv(envp) は、envp が指すオブジェクトで表現された浮動小
         数 点 環境を設定します。引数 envp は、fegetenv または fehol-
         dexcept、あるいは、同等のマクロ FE_DFL_ENV (<fenv.h> に定 義
         されている) への呼び出しで設定されたオブジェクトを指していな
         ければなりません。fesetenv は、これらの例外を発生するので は
         な く、envp 経由で表現された例外フラグの状態をインストールす
         るだけです。

         マクロ FE_DFL_ENV は、デフォルトの浮動小数点環境を表現する、
         型  fenv_t の const 修飾付きオブジェクトへのポインタに拡張さ
         れます。つまり、すべての例外フラグはクリアされ、すべての例外
         に対して、FE_TONEAREST 丸め方向モードと FEX_NONSTOP 処理モー
         ドがインストールされます。SPARC システムでは、この環境は規格
         以外の算術モードも無効になります。Intel システムでは、この環
         境は FE_LDBLPREC 丸め精度モードを持ちます。

         feholdexcept(envp) は、現在の浮動小数点環境を envp が指す オ
         ブジェクトに保存し、例外フラグをクリアし、すべての例外に対し
         て FEX_NONSTOP 例外処理モードをインストールします。

         feupdateenv(envp) は、envp が指すオブジェクトで表現された 浮
         動小数点環境を確立し、以前の環境で設定されていたフラグに対応
         する例外を発生します。すべての例外に対して、新たに確立された
         環 境で FEX_NONSTOP 処理モードが有効である場合は、例外のフラ
         グが設定されます。そうでない場合は、fex_set_handling(3M)  に
         記 述されているように適切なアクションが行われます。引数 envp
         は、feholdexcept または fegetenv、あるいは、同等 の マ ク ロ
         FE_DFL_ENV  への呼び出しで設定されたオブジェクトを指していな
         ければなりません。

         fex_merge_flags(envp) は、envp が指すオブジェクトで表現さ れ
         た環境に設定されている例外フラグを現在の環境にコピーします。
         引数 envp は、feholdexcept または fegetenv、あるいは、同等の
         マクロ FE_DFL_ENV への呼び出しで設定されたオブジェクトを指し
         ていなければなりません。fex_merge_flags 関数は、これらの例外
         を発生するのではなく、フラグを設定するだけです。

## 戻り値

         feholdexcept は、すべての例外に対して FEX_NONSTOP 例外 処 理
         モードが確立されている場合にはゼロを返し、そうでない場合はゼ
         ロ以外の値を返します。

## 使用例

         次のコード例の一部は、間違ったアンダーフローを無視し、他の全
         ての例外を出力する計算を行います。

              #include <fenv.h>
              /*...*/
              {
                   fenv_t save_env;

                   feholdexcept(&save_env);
                   /* 例外を発生する可能性のある計算 */
                   if (fetestexcept(FE_UNDERFLOW))
                        feclearexcept(FE_UNDERFLOW);
                   feupdateenv(&save_env);
                   /*...*/
              }

## 属性

         次の属性については、 attributes(5) を参照してください。

         ______________________________________________________
        |      属性タイプ     |             属性値            |
        |_____________________|_______________________________|
        | 使用条件            |  SPROm9xs                     |
        | インタフェース安定性|  標準、安定、廃止 (以下を参照)|
        | MT レベル           |  MT-安全                      |
        |_____________________|_______________________________|

         fegetenv、fesetenv、feholdexcept、feupdateenv 関数は C99  規
         格 で 定義されています。この関数のインタフェース安定性は「標
         準」です。

          fex_merge_flags 関数は規格により定義されていません。この 関
         数のインタフェース安定性は「安定」です。

         これらの関数がはじめて実装された 1996 年の C99 規格の草案 で
         は、 feholdexcept は、要求した丸めモードが確立されている場合
         にはゼロ以外の値を返し、それ以外はゼロを返すと規定されていま
         した。つまり、最終的な定義とは逆の内容が規格に盛り込まれたわ
         けです。規格草案の変更に対応できるように、当時の  libm9x  に
         は、C99 規格草案に準拠した関数 feholdexcept96 が用意されてい
         ました。"96" が接尾辞のこの関数は、<fenv96.h>ファイルで宣 言
         さ れました。現在では C99 は完成し、これらの接尾辞付き関数お
         よび <fenv96.h> ヘッダーファイルは必要なくなりました。この関
         数のインタフェース安定性は「廃止」です。

         <fenv96.h> ヘッダーファイルは今後のリリースでは削除 さ れ ま
         す。アプリケーションは標準関数と <fenv.h> ヘッダーファイルを
         代わりに使用します。

## 関連項目

         feclearexcept(3M)、     fesetround(3M)、     fesetprec(3M)、
         fex_set_handling(3M)、 fex_set_log(3M)、 attributes(5)

         『 数値計算ガイド』

## 注意事項

         マルチスレッド化されたプログラムでは、上記関数は、呼び出した
         スレッドだけの浮動小数点環境に影響を与えます。

         例外に対して FEX_CUSTOM 処理モードが有効である と き、 feup-
         dateenv  経 由でその例外を発生すると、処理関数が呼び出されま
         す。処理関数は例外フラグを変更し、fex_set_handling(3M) に 記
         述されているように設定します。ハンドラが戻す値はすべて無視さ
         れます。

         このページに記述されている関数は、必要に応じて 自 動 的 に、
         SIGFPE  ハンドラをインストールまたはインストール解除し、浮動
         小数点状態レジスタのトラップ有効モードビットを設定またはクリ
         ア し ます。これらの関数をプログラムで使用し、個別に、SIGFPE
         ハンドラをインストールしようとした場合、あるいはトラップ有効
         モードビットを制御しようとした場合、その結果の動作は定義され
         ていません。

         fex_set_handling(3M) に記述されているように、FEX_CUSTOM モー
         ドでインストールされている処理関数が呼び出されると、すべての
         例外トラップは無効になります。そして、SIGFPE がブロックさ れ
         ている間は、再び有効になることはありません。したがって、ハン
         ドラ内で fesetenv または feupdateenv を呼び出し、環境を変 更
         しようとすると、予期せぬ結果になります。

         「形式」で示しているように、cc で libm9x とリンクするため に
         は、コマンド行で次のように指定することを推奨します。

              -Rinstall-path/lib -Linstall-path/lib -lm9x

         install-path には、コンパイラがインストールされている場所 を
         指 定します (デフォルトでは、/opt/SUNWspro)。libm9x とリンク
         する方法についての詳細は、『数値計算ガイド』を参照してくださ
         い。