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 または feholdexcept、あるいは、同等のマクロ 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 処理モードが有効であるとき、feupdateenv 経由でその例外を発生すると、処理関数が呼び出されます。処理関数は例外フラグを変更 し、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 とリンクする方法についての詳細は、 『数値計算ガイド』を参照してください。