Sun Studio 12: Fortran ライブラリ・リファレンス

1.4.26 ieee_flags、ieee_handler、sigfpe: IEEE 算術演算

これらの副プログラムは、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 を呼び出すと、トラップ可能マスクビットが自動的に設定されます。

modeexception が受け付ける文字型のキーワードは、action の値によって異なります。

表 1–6 ieee_flags( action , mode , in , out) パラメータと動作

action = ’clearall’

modeinout は未使用。戻り値は 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 の設定値を調査する

inout は、空白にするか、テスト対象の設定値の 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_DEFAULTSIGFPE_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 の値は、プラットフォームによって異なります。同様にコーディングすれば、invalidinexact のような例外を検出できます。

例 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

addressfunction hand の宣言を INTEGER*8 に変更すると、64 ビットの SPARC 環境 (-m64) で例 5 が実行できます。

数値計算ガイド』を参照してください。参照: floatingpoint(3)、signal(3)、sigfpe(3)、floatingpoint(3F)、ieee_flags(3M)、および ieee_handler(3M)

1.4.26.1 floatingpoint.h: Fortran IEEE 定義

ヘッダーファイル floatingpoint.h は、ANSI/IEEE 規格 754-1985 に従って、標準浮動小数点の実装に使用される定数と型を定義します。

このファイルの Fortran 95 ソースプログラムへのインクルードは、次のように行います。


#include "floatingpoint.h"

このインクルードファイルを使用するには、Fortran のコンパイル前に前処理が必要になります。このインクルードファイルを参照するソースファイルは、名前の拡張子が FF90、または F95 の場合に、自動的に前処理が行われます。

IEEE 丸めモード

fp_direction_type

IEEE 丸め方向モードの型。列挙の順序はハードウェアにより異なるので注意すること 

SIGFPE 処理

sigfpe_code_type

SIGFPE コードの型

sigfpe_handler_type

ユーザー定義の SIGFPE 例外ハンドラの型。 特定の SIGFPE コードを処理するために呼び出される。

SIGFPE_DEFAULT

デフォルトの SIGFPE 例外処理を指示するマクロ。IEEE 例外。デフォルトの結果で実行を継続させ、ほかの SIGFPE コードに対しては実行を異常終了させる。

SIGFPE_IGNORE

代替 SIGFPE 例外処理を指示するマクロ。 無視して実行を継続させる。

SIGFPE_ABORT

代替 SIGFPE 例外処理を指示するマクロ。 コアダンプを取り、実行を異常終了させる。

IEEE 例外処理

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)