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

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

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

ファイル名 ファイル・タイプ ロケーション
xlf_fp_util.mod モジュール・シンボル・ファイル
  • インストール・パス/xlf/9.1/include

これらのプロシージャーを使用するには、 ソース・ファイルに 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 例外を除く、すべての例外の要約フラグ

注:

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

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

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

clr_fpscr_flags

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

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

結果の値と属性

INTEGER(FPSCR_KIND)

結果の値

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

USE, INTRINSIC :: 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, 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

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

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

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

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

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.
 
IBM Copyright 2003