マニュアルページ feupdateenv.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-安全        |
    |_____________________|_________________|

     feholdexcept 関数は C9X 規格で定義されています。libm9x が は
     じ めて実装された 1996 年の C9X 規格の草案では、feholdexcept
     は、FEX_NONSTOP 例外処理モードが確立されている場合にはゼロ以
     外の値を返すと規定されていました。つまり、最終的な定義とは逆
     の内容が規格に盛り込まれたわけです。規格草案の変更に対応でき
     る よ う に、 当時の libm9x には、C9X 規格草案に準拠した関数
     feholdexcept96 が用意されていました。また、<fenv.h> ヘッダー
     ファ イルが、feholdexcept の名前を自動的に feholdexcept96 に
     再定義していたため、<fenv.h> を使用するプログラムは、この 代
     わりの関数を呼び出していました。C9X 規格の完成にともない、現
     在は feholdexcept96 に加えて、規格に準拠した feholdexcept が
     実 装 さ れ て います。そのため、<fenv.h> は feholdexcept を
     feholdexcept96 に再定義しません。結果として、元 の  <fenv.h>
     を 使用してコンパイルされたプログラムには、当時の C9X 草案で
     定義されていた戻り値に対する依存が残されることになります。元
     の定義との互換性を保つには、プログラムが明示的に代わりの関数
     feholdexcept96 を呼び出す必要がありま す  ( こ の 関 数 は、
     <fenv96.h>  ヘッダーファイル中で宣言されています)。feholdex-
     cept96 関数は C9X 規格の一部ではないので、その動作は以前と変
     わりません。この関数のインタフェース安定性は「安定」です。し
     かし、この関数はあくまで以前の C9X 定義に準拠した  feholdex-
     cept  に依存する、既存のプログラムの動作に互換性を持たせるた
     めのものです。新しいプログラムを作成する場合は、標準の関数を
     使用してください。


関連項目

     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 とリンク
     する方法についての詳細は、『』を参照してくださ
     い。