マニュアルページ fex_merge_flags.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 とリンク
する方法についての詳細は、『数値計算ガイド』を参照してくださ
い。