XL Fortran for AIX V8.1.1

ランゲージ・リファレンス


浮動小数点制御および照会のための効果的なプロシージャー

XL Fortran には、浮動小数点の状況やプロセッサーの制御レジスターを直接的に照会および制御できるプロシージャーがいくつかあります。これらのプロシージャーは浮動小数点の状況および制御レジスター (fpscr) を直接操作するインラインのマシン・インストラクションにマップされるため、 fpgets および fpsets サブルーチンよりも効果的です。

XL Fortran は、モジュール xlf_fp_util を提供します。このモジュールには、これらのプロシージャー用のインターフェースとデータ型定義、およびプロシージャーに必要な名前定数の定義が含まれています。このモジュールにより、リンク時まで待たずに、コンパイル時にこれらのプロシージャーのタイプ・チェックを行うことができます。例にリストされる引き数名は、プロシージャーを呼び出すときにキーワード引き数の名前として使用できます。 xlf_fp_util モジュール用に、次のファイルが提供されています。


ファイル名 ファイル・タイプ 場所
xlf_fp_util.mod モジュール・シンボル・ファイル (32 ビット)
  • /usr/lpp/xlf/include_32_d10
  • /usr/lpp/xlf/include_32_d7

注:
これらのディレクトリー内のファイルは、それぞれまったく同じものです。
モジュール・シンボル・ファイル (64 ビット)
  • /usr/lpp/xlf/include64

これらのプロシージャーを使用するには、ソース・ファイルに USE XLF_FP_UTIL ステートメントを追加する必要があります。 USE について、詳しくは USE を参照してください。

名前の競合が生じる場合 (たとえば、アクセス元のサブプログラムにモジュール・エンティティーと同じ名前のエンティティーがある場合) は、ONLY 節を使用するか、または USE ステートメントの名前変更機能を使用してください。以下に例を示します。

USE XLF_FP_UTIL, NULL1 => get_fpscr, NULL2 => set_fpscr

-U オプションを指定してコンパイルする場合は、これらのプロシージャーの名前をすべて小文字でコーディングする必要があります。このことを忘れないようにするために、ここでは小文字で名前を記します。

fpscr プロシージャーには次のものがあります。

次の表は、fpscr で使用される定数をリストしています。

ファミリー 定数 説明
一般
FPSCR_KIND fpscr フラグ変数用の KIND 型付きパラメーター。
FP_MODE_KIND fp_trap 引き数および結果用の KIND 型付きパラメーター。
IEEE 丸めモード
FP_RND_RN 最も近い値への丸め (デフォルト)
FP_RND_RZ ゼロ方向への丸め
FP_RND_RP 正の無限大方向への丸め
FP_RND_RM 負の無限大方向への丸め
FP_RND_MODE fpscr フラグ変数または値から丸めモードを得るために使用される
IEEE 例外使用可能フラグ (1) TRP_INEXACT inexact トラップを使用可能にする
TRP_DIV_BY_ZERO 0 除算トラップを使用可能にする
TRP_UNDERFLOW アンダーフロー・トラップを使用可能にする
TRP_OVERFLOW オーバーフロー・トラップを使用可能にする
TRP_INVALID 無効トラップを使用可能にする
FP_ENBL_SUMM トラップ使用可能の要約またはすべての使用可能化
IEEE 例外状況フラグ
FP_INVALID 無効な演算の例外
FP_OVERFLOW オーバーフロー例外
FP_UNDERFLOW アンダーフロー例外
FP_DIV_BY_ZERO 0 除算例外
FP_INEXACT Inexact 例外
FP_ALL_IEEE_XCP すべての IEEE 例外の要約フラグ
FP_COMMON_IEEE_XCP FP_INEXACT 例外を除く、すべての IEEE 例外の要約フラグ
マシン特有の例外の詳細フラグ
FP_INV_SNAN NaN シグナルを発信
FP_INV_ISI 無限大 - 無限大
FP_INV_IDI 無限大 / 無限大
FP_INV_ZDZ 0 / 0
FP_INV_IMZ 無限大 * 0
FP_INV_CMP 非順序比較
FP_INV_SQRT 負の値の平方根
FP_INV_CVI 整数への変換エラー
FP_INV_VXSOFT ソフトウェアの要求
マシン特有の例外の要約フラグ
FP_ANY_XCP 任意の例外の要約フラグ
FP_ALL_XCP すべての例外の要約フラグ
FP_COMMON_XCP FP_INEXACT 例外を除く、すべての例外の要約フラグ
fp_trap 定数 (2)
FP_TRAP_SYNC 高精度トラップの使用可能化
FP_TRAP_OFF トラップの使用不可
FP_TRAP_QUERY 照会トラップ・モード
FP_TRAP_IMP 回復不能な低精度トラップの使用可能化
FP_TRAP_IMP_REC 回復可能な低精度トラップの使用可能化
FP_TRAP_FASTMODE 最も速いモードを選択
FP_TRAP_ERROR エラー状態
FP_TRAP_UNIMPL 要求されたモードが利用不能

注:

  1. 例外トラップを使用可能にするには、必要な IEEE 例外使用可能フラグを設定する必要があります。

  2. fp_trap の定数について詳しくは、「AIX Technical Reference: Base Operating System and Extensions Volume 1」の fp_trap に関する説明を参照してください。

xlf_fp_util 浮動小数点プロシージャー

この節では、XLF_FP_UTIL モジュールにある、浮動小数点制御および照会のための効果的なプロシージャーをリストします。

clr_fpscr_flags

clr_fpscr_flags サブルーチンは、MASK 引き数で指定した浮動小数点の状況および制御レジスター・フラグを消去します。 MASK で指定していないフラグには影響がありません。 MASK はタイプ INTEGER(FPSCR_KIND) でなければなりません。 MASK の操作には intrinsic プロシージャーを使用します (整数ビット・モデル を参照)。

FPSCR 定数について詳しくは、fpscr の定数を参照してください。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) MASK
 
MASK=(IOR(FP_OVERFLOW,FP_UNDERFLOW))
CALL clr_fpscr_flags(MASK)
 

clr_fpscr_flags サブルーチンの別の例は、 get_fpscr_flags を参照してください。

fp_trap

fp_trap 関数を使用すると、浮動小数点例外がトラップを生成するよう、ユーザー・プロセスのモードを照会または変更できます。引き数 TRAP_MODE は fp_trap 定数でなければなりません。 fp_trap 定数については、fpscr の定数を参照してください。

詳細については、「AIX Technical Reference: Base Operating System and Extensions Volume 1」の fp_trap に関する説明を参照してください。

結果タイプおよび属性

fp_trap は、INTEGER(FP_MODE_KIND) を fp_trap 定数の形で戻します。

結果値

AIX Technical Reference: Base Operating System and Extensions Volume 1」を参照してください。

USE XLF_FP_UTIL
INTEGER(FP_MODE_KIND) FP_MODE, TRAP_MODE
 
TRAP_MODE = FP_TRAP_IMP
FP_MODE = fp_trap(TRAP_MODE)

fp_trap の使用方法を示す別の例について、 set_fpscr_flags を参照してください。

get_fpscr

get_fpscr 関数は、プロセッサーの浮動小数点状況および制御レジスター (fpscr) の現在の値を戻します。

結果タイプおよび属性

INTEGER(FPSCR_KIND)

結果値

プロセッサーの浮動小数点状況および制御レジスター (fpscr) の現行値。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) FPSCR
 
FPSCR=get_fpscr()

get_fpscr_flags

get_fpscr_flags 関数は、MASK 引き数で指定した浮動小数点状況および制御レジスター・フラグの現在の状態を戻します。 MASK はタイプ INTEGER(FPSCR_KIND) でなければなりません。 MASK の操作には intrinsic を使用します (整数ビット・モデルを参照)。

FPSCR 定数について詳しくは、fpscr の定数を参照してください。

結果タイプおよび属性

INTEGER(FPSCR_KIND)

結果値

FPSCR フラグの状況は MASK 引き数によって指定されます。 MASK 引き数で指定されたフラグがオンになっている場合、そのフラグの値が戻り値に返されます。以下の例は、fp_div_by_zero および fp_invalid フラグの状況を要求します。

USE XLF_FP_UTIL
 
! ...
 
IF (get_fpscr_flags(IOR(FP_DIV_BY_ZERO,FP_INVALID)) .NE. 0) THEN
  ! Either Divide-by-zero or an invalid operation occurred.
 
  ! ...
 
  ! After processing the exception, the exception flags are
  ! cleared.
  CALL clr_fpscr_flags(IOR(FP_DIV_BY_ZERO,FP_INVALID))
END IF

get_round_mode

get_round_mode 関数は、現在の浮動小数点丸めモードを戻します。戻り値は、定数 FP_RND_RN、FP_RND_RZ、FP_RND_RP、または FP_RND_RM のいずれか 1 つです。丸めモードの定数について、詳しくはfpscr の定数を参照してください。

結果タイプおよび属性

INTEGER(FPSCR_KIND)

結果値

定数 FP_RND_RN、FP_RND_RZ、FP_RND_RP、または FP_RND_RM のいずれか。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) MODE
 
MODE=get_round_mode()
IF (MODE .EQ. FP_RND_RZ) THEN
! ...
END IF

set_fpscr

set_fpscr 関数は、プロセッサーの浮動小数点状況および制御レジスター (fpscr) を FPSCR 引き数で指定された値に設定し、変更を行う前に、そのレジスターの値を戻します。

引き数タイプおよび属性

整数の kind FPSCR_KIND

結果タイプおよび属性

整数の kind FPSCR_KIND

結果値

set_fpscr に設定される前のレジスターの値。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) FPSCR, OLD_FPSCR
 
FPSCR=get_fpscr()
 
! ...  Some changes are made to FPSCR  ...
 
OLD_FPSCR=set_fpscr(FPSCR)  ! OLD_FPSCR is assigned the value of
                            ! the register before it was
                            ! set with set_fpscr
 

set_fpscr_flags

set_fpscr_flags サブルーチンを使用すると、 MASK 引き数で指定した浮動小数点の状況および制御レジスター・フラグを設定できます。 MASK で指定していないフラグには影響がありません。 MASK はタイプ INTEGER(FPSCR_KIND) でなければなりません。 MASK の操作には intrinsic を使用します (整数ビット・モデルを参照)。

FPSCR 定数について詳しくは、fpscr の定数を参照してください。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) SAVED_FPSCR
INTEGER(FP_MODE_KIND) FP_MODE
 
SAVED_FPSCR = get_fpscr()           ! Saves the current value of
                                    ! the fpscr register.
FP_MODE = fp_trap(FP_TRAP_SYNC)     ! Enables precise trapping.
 
CALL set_fpscr_flags(TRP_DIV_BY_ZERO) ! Enables trapping of
! ...                                 ! divide-by-zero.
FP_MODE=fp_trap(FP_MODE)              ! Restores initial trap
                                      ! mode.
SAVED_FPSCR=set_fpscr(SAVED_FPSCR)    ! Restores fpscr register.
 

set_round_mode

set_round_mode 関数は現在の浮動小数点丸めモードを設定し、変更を行う前に、その丸めモードを戻します。設定できるモードは、FP_RND_RN、FP_RND_RZ、 FP_RND_RP、または FP_RND_RM です。丸めモードの定数について、詳しくはfpscr の定数を参照してください。

引き数タイプおよび属性

整数の kind FPSCR_KIND

結果タイプおよび属性

整数の kind FPSCR_KIND

結果値

変更前の丸めモード。

USE XLF_FP_UTIL
INTEGER(FPSCR_KIND) MODE
 
MODE=set_round_mode(FP_RND_RZ)  ! The rounding mode is set to
                                ! round towards zero.  MODE is
! ...                           ! assigned the previous rounding
                                ! mode.
MODE=set_round_mode(MODE)       ! The rounding mode is restored.
 


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]