XL Fortran には、浮動小数点の状況やプロセッサーの制御レジスターを直接的に 照会および制御できるプロシージャーがいくつかあります。 これらのプロシージャーは浮動小数点の状況および制御レジスター (fpscr) を 直接操作するインラインのマシン・インストラクションにマップされるため、 fpgets および fpsets サブルーチンよりも効果的です。
XL Fortran は、モジュール xlf_fp_util を提供します。
このモジュールには、
これらのプロシージャー用のインターフェースとデータ型定義、
およびプロシージャーに必要な名前定数の定義が含まれています。
このモジュールにより、リンク時まで待たずに、
コンパイル時にこれらのプロシージャーの型チェックを行うことができます。
例にリストされる引き数名は、
プロシージャーを呼び出すときにキーワード引き数の名前として使用できます。
xlf_fp_util モジュール用に、次のファイルが提供されています。
ファイル名 | ファイル・タイプ | ロケーション |
---|---|---|
xlf_fp_util.mod | モジュール・シンボル・ファイル |
|
これらのプロシージャーを使用するには、 ソース・ファイルに 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 型付きパラメーター。 |
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 例外を除く、すべての例外の要約フラグ |
注:
本節では、XLF_FP_UTIL 組み込みモジュールにある、 浮動小数点制御および照会のための効果的なプロシージャーをリストします。
型
clr_fpscr_flags サブルーチンは、MASK 引き数で指定した 浮動小数点の状況および制御レジスター・フラグを消去します。 MASK で指定していないフラグには影響がありません。 MASK は型 INTEGER(FPSCR_KIND) でなければなりません。 MASK の操作には intrinsic プロシージャーを 使用します (整数ビット・モデル を参照)。
FPSCR 定数について詳しくは、FPSCR 定数を参照してください。
例
USE, INTRINSIC :: XLF_FP_UTIL INTEGER(FPSCR_KIND) MASK ! Clear the overflow and underflow exception flags MASK=(IOR(FP_OVERFLOW,FP_UNDERFLOW)) CALL clr_fpscr_flags(MASK)
clr_fpscr_flags サブルーチンの別の例は、 get_fpscr_flags を参照してください。
型
get_fpscr 関数は、 プロセッサーの浮動小数点状況および制御レジスター (fpscr) の現在の値を戻します。
結果の値と属性
INTEGER(FPSCR_KIND)
結果の値
プロセッサーの浮動小数点状況および制御レジスター ((FPSCR) の現行値。
例
USE, INTRINSIC :: 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, INTRINSIC :: 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, INTRINSIC :: XLF_FP_UTIL INTEGER(FPSCR_KIND) MODE MODE=get_round_mode() IF (MODE .EQ. FP_RND_RZ) THEN ! ... END IF
型
set_fpscr 関数は、プロセッサーの浮動小数点状況および 制御レジスター (fpscr) を FPSCR 引き数で指定された値に設定し、 変更を行う前に、そのレジスターの値を戻します。
引き数の型と属性
INTEGER(FPSCR_KIND)
結果の値と属性
INTEGER(FPSCR_KIND)
結果の値
set_fpscr に設定される前のレジスターの値。
例
USE, INTRINSIC :: 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 定数を参照してください。
例
型
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.