これらの副プログラムは、Fortran プログラムで ANSI/IEEE 規格 754-1985 の算術演算機能を十分に利用するために必要なモードと状態を提供します。これらの副プログラムは関数 ieee_flags(3M)、ieee_handler(3M)、および sigfpe(3) と密接に対応しています。
表 1–5 IEEE 算術演算サポートルーチン
ieeer = ieee_flags( action,mode,in,out ) ieeer = ieee_handler(action,exception,hdl ) ieeer = sigfpe( code, hdl ) |
||
action |
character |
入力 |
code |
sigfpe_code_type |
入力 |
mode |
character |
入力 |
in |
character |
入力 |
exception |
character |
入力 |
hdl |
sigfpe_handler_type |
入力 |
out |
character |
出力 |
戻り値 |
INTEGER*4 |
出力 |
これらの関数を効果的に使用する方法については、『数値計算ガイド 』を参照してください。
sigfpe を使用する場合、浮動小数点状態レジスタ内の対応するトラップ可能マスクビットをユーザーが設定する必要があります。詳細は『SPARC アーキテクチャーマニュアルバージョン 8』(トッパン刊) で説明されています。libm 関数の ieee_handler を呼び出すと、トラップ可能マスクビットが自動的に設定されます。
mode と exception が受け付ける文字型のキーワードは、action の値によって異なります。
表 1–6 ieee_flags( action , mode , in , out) パラメータと動作
action = ’clearall’ |
mode、in、out は未使用。戻り値は 0 |
|
action = ’clear’ clear mode, in out は未使用。戻り値は 0 |
mode = ’direction’ | |
mode = ’exception’ |
in = ’inexact’ ’division’ ’underflow’ ’overflow’ ’invalid’ ’all’ ’common’ のいずれか |
|
action = ’set’ 浮動小数点の mode と in を設定する out は未使用。戻り値は 0 |
mode = ’direction’ |
in = ’nearest’ ’tozero’ ’positive’ ’negative’ のいずれか |
mode = ’exception’ |
in = ’inexact’ ’division’ ’underflow’ ’overflow’ ’invalid’ ’all’ ’common’ のいずれか |
|
action = ’get’ mode の設定値を調査する in、out は、空白にするか、テスト対象の設定値の 1 つを設定する。in、out に設定値を設定すると、mode の設定値に従った現在の設定値または 'not available' (無効) が戻る。関数は 0 を戻す。ただし、mode = 'exception' の場合は、現在の例外フラグを戻す。 |
mode =’direction’ |
out = ’nearest’ ’tozero’ ’positive’ ’negative’ のいずれか |
mode =’exception’ |
out = ’inexact’ ’division’ ’underflow’ ’overflow’ ’invalid’ ’all’ ’common’ のいずれか |
表 1–7 ieee_handler( action , in , out) パラメータ
action = ’clear’ in に指定したユーザー例外処理をクリアする。 out は未使用 |
in = ’inexact’ ’division’ ’underflow’ ’overflow’ ’invalid’ ’all’ ’common’ のいずれか |
action = ’set’ in にユーザー例外処理を設定する。out は、ルーチンのアドレスまたは floating point.h に定義されている SIGFPE_DEFAULT、SIGFPE_ABORT、または SIGFPE_IGNORE。 |
in = ’inexact’ ’division’ ’underflow’ ’overflow’ ’invalid’ ’all’ ’common’ のいずれか |
例 1: (ハードウェアが方向をもつ丸めモードをサポートしていない場合を除いて) 丸め方向をゼロの方向に設定します。
INTEGER*4 ieeer character*1 mode, out, in ieeer = ieee_flags( 'set', 'direction', 'tozero', out ) |
例 2: 丸め方向をクリアします (デフォルトの方向、つまり四捨五入して丸めます)。
character*1 out, in ieeer = ieee_flags('clear','direction', in, out ) |
例 3: 設定されている例外発生ビットをすべてクリアします。
character*18 out ieeer = ieee_flags( 'clear', 'exception', 'all', out ) |
例 4: 例 3 でオーバーフロー例外が発生すると、次のように検出します。
character*18 out ieeer = ieee_flags( 'get', 'exception', 'overflow', out ) if (out .eq. 'overflow' ) stop 'overflow' |
前述の例は、out を overflow に、ieeer を 25 に設定しています。ieeer の値は、プラットフォームによって異なります。同様にコーディングすれば、invalid や inexact のような例外を検出できます。
例 5: hand1.f の内容。シグナルハンドラを書き込み、使用しています。
external hand real r / 14.2 /, s / 0.0 / i = ieee_handler( 'set', 'division', hand ) t = r/s end INTEGER*4 function hand ( sig, sip, uap ) INTEGER*4 sig, address structure /fault/ INTEGER*4 address end structure structure /siginfo/ INTEGER*4 si_signo INTEGER*4 si_code INTEGER*4 si_errno record /fault/ fault end structure record /siginfo/ sip address = sip.fault.address write (*,10) address 10 format('例外の起きたアドレス (16進) ', z8 ) end |
address と function hand の宣言を INTEGER*8 に変更すると、64 ビットの SPARC 環境 (-m64) で例 5 が実行できます。
『数値計算ガイド』を参照してください。参照: floatingpoint(3)、signal(3)、sigfpe(3)、floatingpoint(3F)、ieee_flags(3M)、および ieee_handler(3M)
ヘッダーファイル floatingpoint.h は、ANSI/IEEE 規格 754-1985 に従って、標準浮動小数点の実装に使用される定数と型を定義します。
このファイルの Fortran 95 ソースプログラムへのインクルードは、次のように行います。
#include "floatingpoint.h" |
このインクルードファイルを使用するには、Fortran のコンパイル前に前処理が必要になります。このインクルードファイルを参照するソースファイルは、名前の拡張子が F、F90、または F95 の場合に、自動的に前処理が行われます。
fp_direction_type |
IEEE 丸め方向モードの型。列挙の順序はハードウェアにより異なるので注意すること |
sigfpe_code_type |
SIGFPE コードの型 |
sigfpe_handler_type |
ユーザー定義の SIGFPE 例外ハンドラの型。 特定の SIGFPE コードを処理するために呼び出される。 |
SIGFPE_DEFAULT |
デフォルトの SIGFPE 例外処理を指示するマクロ。IEEE 例外。デフォルトの結果で実行を継続させ、ほかの SIGFPE コードに対しては実行を異常終了させる。 |
SIGFPE_IGNORE |
代替 SIGFPE 例外処理を指示するマクロ。 無視して実行を継続させる。 |
SIGFPE_ABORT |
代替 SIGFPE 例外処理を指示するマクロ。 コアダンプを取り、実行を異常終了させる。 |
N_IEEE_EXCEPTION |
IEEE 浮動小数点例外の数 |
fp_exception_type |
N_IEEE_EXCEPTION 個の例外の型。各例外はビット番号を与えられる。 |
fp_exception_field_type |
fp_exception_type により番号が与えられた IEEE 例外に対応する N_IEEE_EXCEPTION 個以上のビットをとることを目的とした型です。たとえば fp_inexact は最下位ビットに対応し、fp_invalid は最下位から 5 番目のビットに対応する。操作によっては 2 つ以上の例外を設定できる。 |
IEEE クラス分類
fp_class_type |
IEEE 浮動小数点の値と記号のクラスの並び |
『数値計算ガイド』を参照してください。参照: ieee_environment(3F)