XL Fortran には、浮動小数点の状況やプロセッサーの制御レジスターを直接的に照会および制御できるプロシージャーがいくつかあります。これらのプロシージャーは浮動小数点の状況および制御レジスター (fpscr) を直接操作するインラインのマシン・インストラクションにマップされるため、 fpgets および fpsets サブルーチンよりも効果的です。
XL Fortran は、モジュール xlf_fp_util を提供します。このモジュールには、これらのプロシージャー用のインターフェースとデータ型定義、およびプロシージャーに必要な名前定数の定義が含まれています。このモジュールにより、リンク時まで待たずに、コンパイル時にこれらのプロシージャーのタイプ・チェックを行うことができます。例にリストされる引き数名は、プロシージャーを呼び出すときにキーワード引き数の名前として使用できます。 xlf_fp_util モジュール用に、次のファイルが提供されています。
ファイル名 | ファイル・タイプ | 場所 |
---|---|---|
xlf_fp_util.mod | モジュール・シンボル・ファイル (32 ビット) |
|
モジュール・シンボル・ファイル (64 ビット) |
|
これらのプロシージャーを使用するには、ソース・ファイルに USE XLF_FP_UTIL ステートメントを追加する必要があります。 USE について、詳しくは USE を参照してください。
名前の競合が生じる場合 (たとえば、アクセス元のサブプログラムにモジュール・エンティティーと同じ名前のエンティティーがある場合) は、ONLY 節を使用するか、または USE ステートメントの名前変更機能を使用してください。以下に例を示します。
USE XLF_FP_UTIL, NULL1 => get_fpscr, NULL2 => set_fpscr
-U オプションを指定してコンパイルする場合は、これらのプロシージャーの名前をすべて小文字でコーディングする必要があります。このことを忘れないようにするために、ここでは小文字で名前を記します。
fpscr プロシージャーには次のものがあります。
注:
この節では、XLF_FP_UTIL モジュールにある、浮動小数点制御および照会のための効果的なプロシージャーをリストします。
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 関数を使用すると、浮動小数点例外がトラップを生成するよう、ユーザー・プロセスのモードを照会または変更できます。引き数 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 関数は、プロセッサーの浮動小数点状況および制御レジスター (fpscr) の現在の値を戻します。
結果タイプおよび属性
INTEGER(FPSCR_KIND)
結果値
プロセッサーの浮動小数点状況および制御レジスター (fpscr) の現行値。
例
USE XLF_FP_UTIL INTEGER(FPSCR_KIND) FPSCR FPSCR=get_fpscr()
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 関数は、現在の浮動小数点丸めモードを戻します。戻り値は、定数 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 関数は、プロセッサーの浮動小数点状況および制御レジスター (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 サブルーチンを使用すると、 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 関数は現在の浮動小数点丸めモードを設定し、変更を行う前に、その丸めモードを戻します。設定できるモードは、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.