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