XL Fortran for AIX V8.1.1

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

+----------------------------------IBM 拡張----------------------------------+


IEEE モジュールとサポート

XL Fortran は、Fortran 2000 のドラフト標準で指定された IEEE 浮動小数点機能のサポートを提供します。ドラフト標準では、例外に対応する IEEE_EXCEPTIONS モジュール、 IEEE 演算をサポートする IEEE_ARITHMETIC モジュール、およびコンパイラーによってサポートされる IEEE 機能を指定する IEEE_FEATURES が定義されています。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC 組み込みモジュールを使用する場合、 XL Fortran コンパイラーは、丸めモード、停止モード、および例外フラグについての浮動小数点状況に対する変更の有効範囲に関するいくつかの Fortran 2000 のドラフト標準規則を実施しています。このことで、上記のモジュールを使用していても、新しい浮動小数点状況セマンティクスを使用しないプログラムのパフォーマンスが低下する可能性があります。そのようなプログラムに対して、浮動小数点状況の保管と復元に関する規則を緩和するために、-qstrictieeemod コンパイラー・オプションが提供されています。

注:

  1. XL Fortran 拡張精度浮動小数点数は、IEEE 標準で提唱されている形式にはなっていません。結果として、モジュールの一部で REAL(16) をサポートしません。

  2. IEEE_SET_FLAG サブルーチンは、POWER および POWER2 プラットフォームで IEEE_INVALID 例外フラグを設定しません。

  3. IEEE モジュールの停止機能を使用するプログラムは、-qflttrap オプションを指定してコンパイルする必要があります。停止を使用可能にしていて例外が発生すると、 IEEE モジュールは SIGTRAP シグナルを生成します。-qflttrap=imprecise コンパイラー・オプションを指定すれば、Fortran 2000 ドラフト標準の要件に準拠しつつ、停止のパフォーマンスへの影響は少なくなります。

コンパイルと例外処理

XL Fortran は、IEEE 標準に完全に準拠するための多くのオプションを提供しています。

関連情報

IEEE 浮動小数点の詳細、および上記のコンパイラー・オプションの特定の説明については、「ユーザーズ・ガイド」の『XL Fortran 浮動小数点処理』を参照してください。

IEEE をインプリメントするための一般規則

IEEE_ARITHMETICIEEE_EXCEPTIONSIEEE_FEATURES は組み込みモジュールです。ただし、これらのモジュールで定義されるタイプおよびプロシージャーは組み込みではありません。

IEEE モジュールに含まれるすべての関数は純粋 (PURE) です。

すべてのプロシージャー名は汎用であり、特定ではありません。

すべての例外フラグのデフォルト値は静止です。

デフォルトでは、例外は停止を起こさせません。

丸めモードのデフォルトは、最も近い値への丸めとなります。

IEEE 派生データ型と定数

IEEE モジュールは、以下の派生型を定義します。

IEEE_FLAG_TYPE

特定の例外フラグを識別する IEEE_EXCEPTIONS モジュールによって定義される派生データ型。IEEE_FLAG_TYPE の値は、IEEE_EXCEPTIONS モジュールで定義される以下の名前付き定数のいずれかである必要があります。

IEEE_OVERFLOW
組み込みの実数の演算または割り当ての結果に、大きすぎて表すことができない指数があるときに発生します。また、この例外は、組み込みの複素数の演算または割り当ての結果の実数部分または虚数部分に、大きすぎて表すことができない指数があるときにも発生します。

REAL(4) を使用している場合は、結果値の不偏指数が 127 より大か、または -126 より小であるときに、オーバーフローが発生します。

REAL(8) を使用している場合は、結果値の不偏指数が 1023 より大か、または -1022 より小であるときに、オーバーフローが発生します。

IEEE_DIVIDE_BY_ZERO
実数または複素数の除算でゼロ以外の分子とゼロの分母があるときに発生します。

IEEE_INVALID
実数演算または複素数の演算または割り当てが無効であるときに、発生します。

IEEE_UNDERFLOW
組み込みの実数の演算または割り当ての結果に、小さすぎてゼロ以外の値で表すことができない絶対値があり、精度の消失が検出されるときに発生します。また、この例外は、組み込みの複素数の演算または割り当ての結果の実数部分または虚数部分に、小さすぎてゼロ以外の値で表すことができない絶対値があり、精度の消失が検出されるときにも発生します。

REAL(4) を使用している場合は、結果の絶対値が 2-149 より小であるときに、アンダーフローが発生します。

REAL(8) を使用している場合は、結果の絶対値が 2-1074 より小であるときに、アンダーフローが発生します。

IEEE_INEXACT
実数または複素数の割り当てまたは演算が不正確であるときに、発生します。

以下の定数は、IEEE_FLAG_TYPE の配列です。

IEEE_USUAL
順に IEEE_OVERFLOWIEEE_DIVIDE_BY_ZERO、および IEEE_INVALID のエレメントを含む配列名前付き定数。

IEEE_ALL
順に IEEE_USUALIEEE_UNDERFLOW、および IEEE_INEXACT のエレメントを含む配列名前付き定数。

IEEE_STATUS_TYPE

現在の浮動小数点状況を表す、IEEE_ARITHMETIC モジュールで定義される派生データ型。浮動小数点状況は、すべての例外フラグ、停止、および丸めモードの値を網羅します。

IEEE_CLASS_TYPE

1 つのクラスの浮動小数点値をカテゴリー化する IEEE_ARITHMETIC モジュールで定義される派生データ型。IEEE_CLASS_TYPE の値は IEEE_ARITHMETIC モジュールで定義される以下の名前付き定数のいずれかである必要があります。


IEEE_SIGNALING_NAN IEEE_NEGATIVE_ZERO
IEEE_QUIET_NAN IEEE_POSITIVE_ZERO
IEEE_NEGATIVE_INF IEEE_POSITIVE_DENORMAL
IEEE_NEGATIVE_NORMAL IEEE_POSITIVE_NORMAL
IEEE_NEGATIVE_DENORMAL IEEE_POSITIVE_INF

IEEE_ROUND_TYPE

特定の丸めモードを識別する IEEE_ARITHMETIC モジュールで定義される派生データ型。IEEE_ROUND_TYPE の値は、IEEE_ARITHMETIC モジュールで定義される以下の名前付き定数のいずれかである必要があります。

IEEE_NEAREST
正確な結果を最も近い表現可能な数に丸めます。

IEEE_TO_ZERO
正確な結果を、ゼロの方向で次の表現可能な数に丸めます。

IEEE_UP
正確な結果を、正の方向で次の表現可能な数に丸めます。

IEEE_DOWN
正確な結果を、負の方向で次の表現可能な数に丸めます。

IEEE_OTHER
丸めモードが IEEE 標準に準拠しないことを示します。

IEEE_FEATURES_TYPE

使用する IEEE 機能を識別する、IEEE_FEATURES モジュールで定義される派生データ型。IEEE_FEATURES_TYPE の値は、IEEE_FEATURES モジュールで定義される以下の名前付き定数のいずれかである必要があります。


IEEE_DATATYPE IEEE_DATATYPE
IEEE_DENORMAL IEEE_INVALID_FLAG
IEEE_DIVIDE IEEE_NAN
IEEE_HALTING IEEE_ROUNDING
IEEE_INEXACT_FLAG IEEE_SQRT
IEEE_INF IEEE_UNDERFLOW_FLAG

IEEE 演算子

IEEE_ARITHMETIC モジュールは、IEEE_CLASS_TYPE または IEEE_ROUND_TYPE の変数を比較するための 2 組のエレメント型演算子を定義します。

==
2 つの IEEE_CLASS_TYPE 値、または 2 つの IEEE_ROUND_TYPE 値を比較できるようにします。この演算子は、値が同一である場合は true を戻し、値が異なる場合は false を戻します。

/=
2 つの IEEE_CLASS_TYPE 値、または 2 つの IEEE_ROUND_TYPE 値を比較できるようにします。この演算子は、値が異なる場合は true を戻し、値が同一である場合は false を戻します。

IEEE プロシージャー

以下の IEEE プロシージャーを使用するには、必要に応じて、USE IEEE_ARITHMETICUSE IEEE_EXCEPTIONS、または USE IEEE_FEATURES ステートメントをソース・ファイルに追加する必要があります。USE ステートメントの詳細については、USEを参照してください。

IEEE プロシージャーの使用規則

XL Fortran は、IEEE_FEATURES モジュールのすべての名前付き定数をサポートします。

IEEE_ARITHMETIC モジュールは、IEEE_EXCEPTIONS に対して、USE ステートメントを含んでいるときと同様に動作します。IEEE_EXCEPTIONS で public であるすべての値は、 IEEE_ARITHMETIC でも public のままです。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールがアクセス可能である場合、IEEE_OVERFLOWIEEE_DIVIDE_BY_ZERO はすべての種類の実数および複素数のデータの有効範囲単位内でサポートされます。サポートされている他の例外を判別するには、 IEEE_SUPPORT_FLAG 関数を使用します。停止がサポートされるかどうかを判別するには、IEEE_SUPPORT_HALTING を使用します。他の例外のサポートについては、IEEE_FEATURES モジュールの名前付き定数 IEEE_INEXACT_FLAGIEEE_INVALID_FLAG、および IEEE_UNDERFLOW_FLAG がアクセス可能かどうかによって、以下のような影響を受けます。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC にアクセスしない有効範囲単位への入り口で例外フラグがシグナル通知される場合、コンパイラーは、出口で、その例外フラグが確実に通知されるようにします。このような有効範囲単位への入り口でフラグが静止である場合は、出口でフラグがシグナル通知される可能性があります。

これ以上の IEEE サポートは、IEEE_ARITHMETIC モジュールを介して取得することができます。サポートは、IEEE_FEATURES モジュールの名前付き定数がアクセス可能かどうかによって影響を受けます。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールにアクセスし、 IEEE_FEATURES にはアクセスしない場合には、サポートされる機能のサブセットは、 IEEE_FEATURES にアクセスした場合と同じです。

IEEE_CLASS(X)

エレメント型 IEEE クラス関数。浮動小数点値の IEEE クラスを戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

結果は、IEEE_CLASS_TYPE タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) 関数は、 true の値を戻す必要があります。REAL(16) のデータ型を指定した場合には、 IEEE_SUPPORT_DATATYPE は false を戻します。ただし、クラス・タイプは所定のものが戻されます。

USE IEEE_ARITHMETIC
TYPE(IEEE_CLASS_TYPE) :: C
REAL :: X = -1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  C = IEEE_CLASS(X)                ! C has class IEEE_NEGATIVE_NORMAL
ENDIF

IEEE_COPY_SIGN(X, Y)

エレメント型 IEEE 符号コピー関数。Y の符号を付けた X の値を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X および Y は実数タイプです。ただし kind は異なる可能性があります。

結果タイプおよび属性

結果は、X と同じ kind およびタイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。

NaN および無限大など、サポートされている IEEE 特殊値に対して、IEEE_COPY_SIGNY の符号が付いた X の値を戻します。

IEEE_COPY_SIGN は、-qxlf90=nosignedzero コンパイラー・オプションを無視します。

注:
XL Fortran の REAL(16) 数値には、符号付きゼロがありません。

例 1:

USE IEEE_ARITHMETIC
REAL :: X
DOUBLE PRECISION :: Y
X =  3.0
Y = -2.0
IF (IEEE_SUPPORT_DATATYPE(X) .AND. IEEE_SUPPORT_DATATYPE(Y)) THEN
  X = IEEE_COPY_SIGN(X,Y)               ! X has value -3.0
ENDIF
 

例 2:

USE IEEE_ARITHMETIC
REAL :: X, Y
Y =  1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  X = IEEE_VALUE(X, IEEE_NEGATIVE_INF)  ! X has value -inf
  X = IEEE_COPY_SIGN(X,Y)               ! X has value +inf
ENDIF

IEEE_GET_FLAG(FLAG, FLAG_VALUE)

エレメント型 IEEE サブルーチン。指定された、例外フラグの状況を検索します。フラグがシグナル通知である場合に FLAG_VALUE を true に設定し、そうでない場合は false に設定します。

モジュール

IEEE_ARITHMETIC

構文

ここで、FLAG は、取得する IEEE フラグを指定するタイプ IEEE_FLAG_TYPEINTENT(IN) 引き数です。FLAG_VALUE は、FLAG の値を含む INTENT(OUT) デフォルト論理引き数です。

USE IEEE_EXCEPTIONS
LOGICAL :: FLAG_VALUE
CALL IEEE_GET_FLAG(IEEE_OVERFLOW,FLAG_VALUE)
IF (FLAG_VALUE) THEN
  PRINT *, "Overflow flag is signaling."
ELSE
  PRINT *, "Overflow flag is quiet."
ENDIF

IEEE_GET_HALTING_MODE(FLAG, HALTING)

エレメント型 IEEE サブルーチン。例外に対する停止モードを検索し、フラグによって指定された例外で停止を起こさせる場合は、HALTING を true に設定します。-qflttrap=imprecise を使用する場合、停止は正確ではなく、例外の後に発生することがあります。デフォルトでは、例外は XL Fortran で停止を起こさせません。

モジュール

IEEE_ARITHMETIC

構文

ここで、FLAG は、IEEE フラグを指定するタイプ IEEE_FLAG_TYPEINTENT(IN) 引き数です。HALTINGINTENT(OUT) デフォルト論理です。

USE IEEE_EXCEPTIONS
LOGICAL HALTING
CALL IEEE_GET_HALTING_MODE(IEEE_OVERFLOW,HALTING)
IF (HALTING) THEN
  PRINT *, "The program will halt on an overflow exception."
ENDIF

IEEE_GET_ROUNDING_MODE (ROUND_VALUE)

IEEE サブルーチン。ROUND_VALUE を現行の IEEE 丸めモードに設定します。

モジュール

IEEE_ARITHMETIC

構文

ここで、ROUND_VALUE はタイプ IEEE_ROUND_TYPEINTENT(OUT) スカラーです。

USE IEEE_ARITHMETIC
TYPE(IEEE_ROUND_TYPE) ROUND_VALUE
CALL IEEE_GET_ROUNDING_MODE(ROUND_VALUE) ! Store the rounding mode
IF (ROUND_VALUE == IEEE_OTHER) THEN
  PRINT *, "You are not using an IEEE rounding mode."
ENDIF

IEEE_GET_STATUS(STATUS_VALUE)

IEEE サブルーチン。現行の IEEE 浮動小数点状況を検索します。

モジュール

IEEE_ARITHMETIC

構文

ここで、STATUS_VALUE はタイプ IEEE_STATUS_TYPEINTENT(OUT) スカラーです。

規則

IEEE_SET_STATUS 呼び出しでは、STATUS_VALUE だけを使用できます。

USE IEEE_ARITHMETIC
TYPE(IEEE_STATUS_TYPE) STATUS_VALUE
...
CALL IEEE_GET_STATUS(STATUS_VALUE)   ! Get status of all exception flags
CALL IEEE_SET_FLAG(IEEE_ALL,.FALSE.) ! Set all exception flags to quiet
... ! calculation involving exception handling
CALL IEEE_SET_STATUS(STATUS_VALUE)   ! Restore the flags

IEEE_IS_FINITE(X)

エレメント型 IEEE 関数。値が有限であるかどうかを検査します。IEEE_CLASS(X) が以下の値のいずれかを持っている場合には、true を戻します。

それ以外の場合には、false を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果はデフォルト論理タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

USE IEEE_ARITHMETIC
REAL :: X = 1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  PRINT *, IEEE_IS_FINITE(X)    ! Prints true
ENDIF

IEEE_IS_NAN(X)

エレメント型 IEEE 関数。値が IEEE 非数値であるかどうかを検査します。IEEE_CLASS(X) が値 IEEE_SIGNALING_NAN または IEEE_QUIET_NAN を持っている場合には、true を戻します。それ以外の場合には、false を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果はデフォルト論理タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_NAN(X) は、 true の値を戻す必要があります。

例 1:

USE IEEE_ARITHMETIC
REAL :: X = -1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  IF (IEEE_SUPPORT_SQRT(X)) THEN    ! IEEE-compliant SQRT function
    IF (IEEE_SUPPORT_NAN(X)) THEN
      PRINT *, IEEE_IS_NAN(SQRT(X)) ! Prints true
    ENDIF
  ENDIF
ENDIF
 

例 2:

USE IEEE_ARITHMETIC
REAL :: X = -1.0
IF (IEEE_SUPPORT_STANDARD(X)) THEN
  PRINT *, IEEE_IS_NAN(SQRT(X))     ! Prints true
ENDIF

IEEE_IS_NEGATIVE(X)

エレメント型 IEEE 関数。値が負であるかどうかを検査します。IEEE_CLASS(X) が以下の値のいずれかを持っている場合には、true を戻します。

それ以外の場合には、false を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果はデフォルト論理タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(1.0)) THEN
  PRINT *, IEEE_IS_NEGATIVE(1.0)    ! Prints false
ENDIF

IEEE_IS_NORMAL(X)

エレメント型 IEEE 関数。値が正規であるかどうかを検査します。IEEE_CLASS(X) が以下の値のいずれかを持っている場合には、true を戻します。

それ以外の場合には、false を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果はデフォルト論理タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

USE IEEE_ARITHMETIC
REAL :: X = -1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  IF (IEEE_SUPPORT_SQRT(X)) THEN     ! IEEE-compliant SQRT function
    PRINT *, IEEE_IS_NORMAL(SQRT(X)) ! Prints false
  ENDIF
ENDIF

IEEE_LOGB(X)

エレメント型 IEEE 関数。浮動小数点形式で不偏指数を戻します。X の値がゼロでも、無限大でも、NaN でもない場合には、結果は、EXPONENT(X)-1 と等しい、X の不偏指数の値を持ちます。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果は X と同じタイプおよび kind です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X がゼロの場合、結果は負の無限大です。

X が無限大の場合、結果は正の無限大です。

X が NaN の場合、結果は nan です。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(1.1)) THEN
  PRINT *, IEEE_LOGB(1.1)  ! Prints 0.0
ENDIF

IEEE_NEXT_AFTER(X, Y)

エレメント型 IEEE 関数。Y の方向で、マシンによる表現可能な X の次の近隣を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X および Y は実数タイプです。

結果タイプおよび属性

ここで、結果は X と同じタイプおよび kind です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。

XY が等しい場合、関数は、例外をシグナル通知せずに X を戻します。XY が等しくない場合には、Y の方向で、マシンによる表現可能な X の次の近隣を戻します。

いずれかの符号のゼロの近隣は、両方とも非ゼロです。

X は有限だが、IEEE_NEXT_AFTER(X, Y) が無限である場合には、 IEEE_OVERFLOW および IEEE_INEXACT がシグナル通知されます。

IEEE_NEXT_AFTER(X, Y) が非正規またはゼロである場合には、 IEEE_UNDERFLOWIEEE_INEXACT がシグナル通知されます。

X または Y が静止 NaN である場合には、結果は入力 NaN 値の 1 つです。

例 1:

USE IEEE_ARITHMETIC
REAL :: X = 1.0, Y = 2.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  PRINT *, (IEEE_NEXT_AFTER(X,Y) == X + EPSILON(X))  ! Prints true
ENDIF
 

例 2:

USE IEEE_ARITHMETIC
REAL(4) :: X = 0.0, Y = 1.0
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
  PRINT *, (IEEE_NEXT_AFTER(X,Y) == 2.0**(-149))  ! Prints true
ENDIF

IEEE_REM(X, Y)

エレメント型 IEEE 剰余関数。結果値は、丸めモードにかかわりなく、正確に X-Y*N です。ただし、NX/Y の正確な値に最も近い表現可能な整数で、|N - X/Y| = 1/2 の場合は、常に N は偶数です。

モジュール

IEEE_ARITHMETIC

構文

ここで、X および Y は実数タイプです。

結果タイプおよび属性

ここで、結果は、より精度の高い引き数と同じ kind を持つ実数タイプです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。

結果値がゼロである場合には、符号は X と同じです。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(4.0)) THEN
  PRINT *, IEEE_REM(4.0,3.0)  ! Prints  1.0
  PRINT *, IEEE_REM(3.0,2.0)  ! Prints -1.0
  PRINT *, IEEE_REM(5.0,2.0)  ! Prints  1.0
ENDIF

IEEE_RINT(X)

エレメント型 IEEE 関数。現行の丸めモードに従って、整数値に丸めます。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。

結果タイプおよび属性

ここで、結果は X と同じタイプおよび kind です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

結果が値ゼロを持つ場合には、符号は X と同じです。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(1.1)) THEN
  CALL IEEE_SET_ROUNDING_MODE(IEEE_NEAREST)
  PRINT *, IEEE_RINT(1.1)       ! Prints 1.0
  CALL IEEE_SET_ROUNDING_MODE(IEEE_UP)
  PRINT *, IEEE_RINT(1.1)       ! Prints 2.0
ENDIF

IEEE_SCALB(X, I)

エレメント型 IEEE 関数。X * 2I を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプで、IINTEGER タイプです。

結果タイプおよび属性

ここで、結果は X と同じタイプおよび kind です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X * 2I が正規値として表せる場合には、結果は正規値です。

X が有限で、X * 2I が大きすぎる場合には、 IEEE_OVERFLOW 例外が発生します。結果値は、X の符号が付いた無限大になります。

X * 2I が小さすぎて、精度の喪失がある場合には、 IEEE_UNDERFLOW 例外が発生します。結果は、 X の符号が付いた最も近い表現可能な数になります。

X が無限大の場合、結果は、例外がシグナル通知されない X と同じです。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(1.0)) THEN
  PRINT *, IEEE_SCALB(1.0,2)       ! Prints 4.0
ENDIF

IEEE_SELECTED_REAL_KIND([P, R])

変形 IEEE 関数。少なくとも P 桁で、少なくとも R の小数部指数範囲を持つ IEEE 実数データ型の kind 型付きパラメーターの値を戻します。

モジュール

IEEE_ARITHMETIC

構文

ここで、P および R は両方ともオプションの整数タイプのスカラー引き数です。

規則

kind 型付きパラメーターが使用不能で、精度が使用不能である場合には、結果は -1 です。kind 型付きパラメーターが使用不能で、指数範囲が使用不能である場合には、結果は -2 です。kind 型付きパラメーターが使用不能で、精度と指数範囲のいずれも使用不能である場合には、結果は -3 です。

複数の kind 型付きパラメーター値が適用できる場合には、戻される値は最小の小数部精度を持つ値になります。値がいくつかある場合には、それらの kind 値のうち最小のものが戻されます。

       USE IEEE_ARITHMETIC
 
       ! P and R fit in a real(4)
       PRINT *, IEEE_SELECTED_REAL_KIND(6,37)   ! prints 4
 
       ! P needs at least a real(8)
       PRINT *, IEEE_SELECTED_REAL_KIND(14,37)  ! prints 8
       ! R needs at least a real(8)
       PRINT *, IEEE_SELECTED_REAL_KIND(6,307)  ! prints 8
 
       ! P is too large
       PRINT *, IEEE_SELECTED_REAL_KIND(40,37)  ! prints -1
       ! R is too large
       PRINT *, IEEE_SELECTED_REAL_KIND(6,400)  ! prints -2
       ! P and R are both too large
       PRINT *, IEEE_SELECTED_REAL_KIND(40,400) ! prints -3
 
       END

IEEE_SET_FLAG(FLAG, FLAG_VALUE)

IEEE サブルーチン。IEEE 例外フラグに値を割り当てます。

モジュール

IEEE_EXCEPTIONS

構文

ここで、FLAG は、設定されるフラグの値に対応するタイプ IEEE_FLAG_TYPEINTENT(IN) スカラーまたは配列引き数です。 FLAG_VALUE は、例外フラグの望ましい状況に対応する、論理タイプの INTENT(IN) スカラーまたは配列引き数です。 FLAG_VALUE の値は FLAG の値と整合している必要があります。

規則

FLAG_VALUE が true である場合、FLAG で指定する例外フラグはシグナル通知に設定されます。それ以外の場合には、フラグは静止に設定されます。

FLAG の各エレメントは固有の値を持たなければなりません。

USE IEEE_EXCEPTIONS
CALL IEEE_SET_FLAG(IEEE_OVERFLOW, .TRUE.)
! IEEE_OVERFLOW is now signaling

IEEE_SET_HALTING_MODE(FLAG, HALTING)

IEEE サブルーチン。例外の後の継続または停止を制御します。

モジュール

IEEE_EXCEPTIONS

構文

ここで、FLAG は、保留を適用する例外フラグに対応するタイプ IEEE_FLAG_TYPEINTENT(IN) スカラーまたは配列引き数です。HALTING は、希望する停止状況に対応する、論理タイプの INTENT(IN) スカラーまたは配列引き数です。デフォルトでは、例外は XL Fortran で停止を起こさせません。 HALTING の値は FLAG の値と整合している必要があります。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

-qflttrap=imprecise コンパイラー・オプションを使用する場合、停止は正確ではなく、例外の後に発生することがあります。

HALTING が true の場合、FLAG によって指定された例外は停止を発生させます。それ以外の場合は、実行は例外後も継続します。

例外フラグに対してコーディングで停止モードを設定し、 -qflttrap=enable オプションを使用しないでプログラム全体をコンパイルすると、例外発生時にプログラムは予期しない結果を発生させます。詳細については、「ユーザーズ・ガイド」を参照してください。

FLAG の各エレメントは固有の値を持たなければなりません。

@PROCESS FLOAT(NOFOLD)
USE IEEE_EXCEPTIONS
REAL :: X
CALL IEEE_SET_HALTING_MODE(IEEE_DIVIDE_BY_ZERO, .TRUE.)
X = 1.0 / 0.0
! Program will halt with a divide-by-zero exception

IEEE_SET_ROUNDING_MODE (ROUND_VALUE)

IEEE サブルーチン。現行の丸めモードを設定します。

モジュール

IEEE_ARITHMETIC

構文

ここで、ROUND_VALUE は、丸めモードを指定する IEEE_ROUND_TYPE タイプの INTENT(IN) 引き数です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_ROUNDING (ROUND_VALUE, X) は、true の値を戻す必要があります。

このプログラムを呼び出すコンパイル単位は、-qfloat=rrm コンパイラー・オプションでコンパイルする必要があります。

-qfloat=rrm コンパイラー・オプションでコンパイルされたプログラムを呼び出すすべてのコンパイル単位も、このオプションでコンパイルする必要があります。

USE IEEE_ARITHMETIC
IF (IEEE_SUPPORT_DATATYPE(1.1)) THEN
  CALL IEEE_SET_ROUNDING_MODE(IEEE_NEAREST)
  PRINT *, IEEE_RINT(1.1)       ! Prints 1.0
  CALL IEEE_SET_ROUNDING_MODE(IEEE_UP)
  PRINT *, IEEE_RINT(1.1)       ! Prints 2.0
ENDIF

IEEE_SET_STATUS(STATUS_VALUE)

IEEE サブルーチン。浮動小数点状況の値を復元します。

モジュール

IEEE_ARITHMETIC

構文

ここで、STATUS_VALUE は、浮動小数点状況を指定する IEEE_STATUS_TYPE タイプの INTENT(IN) 引き数です。

規則

STATUS_VALUEIEEE_GET_STATUS で事前に設定されていなければいけません。

IEEE_SUPPORT_DATATYPE または IEEE_SUPPORT_DATATYPE(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE 演算をサポートするかどうかを判別します。サポートするとは、オペランドと結果がすべて正規値を持つ場合は必ず、 IEEE 標準に従って、IEEE データ形式を使用し、+-、および * の 2 進演算を実行するという意味です。

注:
NaN および無限大は REAL(16) に対して完全にはサポートされていません。算術演算は、これらの値を必ずしも伝搬するとは限りません。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

X が指定されていない場合、関数は false の値を戻します。

X が指定され、REAL(16) である場合には、関数は false の値を戻します。それ以外の場合は、関数は true を戻します。

USE IEEE_ARITHMETIC
TYPE(IEEE_STATUS_TYPE) STATUS_VALUE
...
CALL IEEE_GET_STATUS(STATUS_VALUE)   ! Get status of all exception flags
CALL IEEE_SET_FLAG(IEEE_ALL,.FALSE.) ! Set all exception flags to quiet
... ! calculation involving exception handling
CALL IEEE_SET_STATUS(STATUS_VALUE)   ! Restore the flags

IEEE_SUPPORT_DENORMAL または IEEE_SUPPORT_DENORMAL(X)

照会 IEEE 関数。現行のインプリメンテーションが非正規値をサポートするかどうかを判別します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが非正規値での算術演算および割り当てをサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。

IEEE_SUPPORT_DIVIDE または IEEE_SUPPORT_DIVIDE(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE 標準の精度の除算をサポートするかどうかを判別します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、IEEE 標準によって指定された精度での除算をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。

IEEE_SUPPORT_FLAG(FLAG) または IEEE_SUPPORT_FLAG(FLAG, X)

照会 IEEE 関数。現行のインプリメンテーションが例外をサポートするかどうかを判別します。

モジュール

IEEE_EXCEPTIONS

構文

ここで、FLAGIEEE_FLAG_TYPE のスカラー引き数です。X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、指定された例外の検出をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。

X が指定されていない場合、結果は false の値を持ちます。

X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合、結果は true の値を持ちます。

IEEE_SUPPORT_HALTING(FLAG)

照会 IEEE 関数。例外の発生後に実行を打ち切るための機能または継続するための機能を現行のインプリメンテーションがサポートするかどうかを判別します。現行のインプリメンテーションによるサポートには、IEEE_SET_HALTING(FLAG) を使用して停止モードを変更する機能が含まれます。

モジュール

IEEE_EXCEPTIONS

構文

ここで、FLAG は、IEEE_FLAG_TYPEINTENT(IN) 引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

結果はすべてのフラグに true の値を戻します。

IEEE_SUPPORT_INF または IEEE_SUPPORT_INF(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE 無限大機能をサポートするかどうかを判別します。サポートするとは、単項演算および 2 項演算 (組み込み関数および組み込みモジュール内の関数によって定義されるものを含む) の IEEE 無限大動作が IEEE 標準に準拠することを言います。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、IEEE の正と負の無限大をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。

XREAL(16) タイプである場合には、結果は false の値を持ちます。それ以外の場合、結果は true の値を持ちます。

IEEE_SUPPORT_IO または IEEE_SUPPORT_IO(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE ベースの変換丸めをサポートするかどうかを判別します。サポートするとは、X が不在の、実数タイプのすべての引き数の IEEE_UPIEEE_DOWNIEEE_ZERO および IEEE_NEAREST モードに対して、または X と同じ kind 型付きパラメーターの実変数に対して、 IEEE 標準に記述された定様式 I/O で IEEE ベースの変換を行うための機能を言います。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合は、結果は true の値を戻します。

IEEE_SUPPORT_NAN または IEEE_SUPPORT_NAN(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE 非数値機能をサポートするかどうかを判別します。サポートするとは、単項演算および 2 進演算 (組み込み関数および組み込みモジュール内の関数によって定義されるものを含む) の IEEE NaN 動作が IEEE 標準に準拠するという意味です。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない場合、結果は false の値を持ちます。

X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合は、結果は true の値を戻します。

IEEE_SUPPORT_ROUNDING (ROUND_VALUE) または IEEE_SUPPORT_ROUNDING (ROUND_VALUE, X)

照会 IEEE 関数。現行のインプリメンテーションが実数タイプの引き数の特定の丸めモードをサポートするかどうかを判別します。サポートするとは、IEEE_SET_ROUNDING_MODE を使用した、丸めモードを変更する機能を言います。

モジュール

IEEE_ARITHMETIC

構文

ここで、ROUND_VALUEIEEE_ROUND_TYPE のスカラー引き数です。X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない場合、実数タイプのすべての引き数に対して、ROUND_VALUE によって定義された丸めモードをインプリメンテーションがサポートするときには、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。

X が指定されている場合、 X と同じ kind 型付きパラメーターの実変数に対して、 ROUND_VALUE によって定義された丸めモードをインプリメンテーションがサポートするときには、結果は true の値を戻します。

X が指定され、REAL(16) タイプである場合には、 ROUND_VALUEIEEE_NEAREST の値を持つときには、結果は false の値を戻します。それ以外の場合は、結果は true の値を戻します。

ROUND_VALUEIEEE_OTHER の値を持つときには、結果は false の値を持ちます。

IEEE_SUPPORT_SQRT または IEEE_SUPPORT_SQRT(X)

照会 IEEE 関数。現行のインプリメンテーションが IEEE 標準によって定義された SQRT をサポートするかどうかを判別します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

X が指定されていない場合、REAL タイプのすべての変数に関して IEEE 規則に SQRT が準拠するときには、結果は true の値を戻します。それ以外の場合は、結果は false の値を持ちます。

X が指定されている場合、X と同じ kind 型付きパラメーター付きの REAL タイプのすべての変数に関して、IEEE 規則に SQRT が準拠するときには、結果は true の値を戻します。

X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合は、結果は true の値を戻します。

IEEE_SUPPORT_STANDARD または IEEE_SUPPORT_STANDARD(X)

照会 IEEE 関数。Fortran 2000 ドラフト標準で定義されたすべての機能がサポートされるかどうかを判別します。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は、実数タイプのスカラーまたは配列値引き数です。

結果タイプおよび属性

結果は、デフォルト論理タイプのスカラーです。

規則

X が指定されていない場合、XL Fortran は REAL(16) をサポートするので、結果は false の値を戻します。

X が指定されている場合、以下の関数も true を戻せば、結果は true の値を戻します。

それ以外の場合は、結果は false の値を持ちます。

IEEE_UNORDERED(X, Y)

エレメント型 IEEE 非順序関数。

モジュール

IEEE_ARITHMETIC

構文

ここで、X および Y は実数タイプです。

結果タイプおよび属性

結果のタイプは、デフォルトの論理値になります。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。

X または Y が NaN である場合に、 true の値を戻す非順序関数。それ以外の場合は、関数は false の値を戻します。

USE IEEE_ARITHMETIC
REAL X, Y
X = 0.0
Y = IEEE_VALUE(Y, IEEE_QUIET_NAN)
PRINT *, IEEE_UNORDERED(X,Y)   ! Prints true
END

IEEE_VALUE(X, CLASS)

エレメント型 IEEE 関数。CLASS によって指定された IEEE 値を生成します。

注:
各種のプラットフォームで NaN 処理が異なるので、この関数のインプリメンテーションはプラットフォームおよびコンパイラーに依存します。バイナリー・ファイルに保管された NaN 値を、値を生成したプラットフォームと異なるプラットフォームで読み取ると、結果は未指定になります。

モジュール

IEEE_ARITHMETIC

構文

ここで、X は実数タイプです。 CLASSIEEE_CLASS_TYPE タイプです。

結果タイプおよび属性

結果は X と同じタイプおよび kind です。

規則

Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。

CLASS の値が IEEE_SIGNALING_NAN または IEEE_QUIET_NAN である場合には、 IEEE_SUPPORT_NAN(X) は true でなくてはいけません。

CLASS の値が IEEE_NEGATIVE_INF または IEEE_POSITIVE_INF である場合には、 IEEE_SUPPORT_INF(X) は true でなくてはいけません。

CLASS の値が IEEE_NEGATIVE_DENORMAL または IEEE_POSITIVE_DENORMAL である場合には、 IEEE_SUPPORT_DENORMAL(X) は true でなくてはいけません。

IEEE_VALUE(X, CLASS) を複数回呼び出すとき、 kind 型付きパラメーターおよび CLASS が同じままである場合には、特定の X 値に対して同じ結果を戻します。

コンパイル単位が IEEE_SIGNALING_NANCLASS 値でこのプログラムを呼び出す場合、コンパイル単位は -qfloat=nans コンパイラー・オプションでコンパイルする必要があります。

USE IEEE_ARITHMETIC
REAL :: X
IF (IEEE_SUPPORT_DATATYPE(X)) THEN
   X = IEEE_VALUE(X, IEEE_NEGATIVE_INF)
   PRINT *, X ! Prints -inf
END IF

浮動小数点状況に関する規則

シグナル通知に設定された例外フラグは、IEEE_SET_FLAG または IEEE_SET_STATUS サブルーチンで静止に設定するまで、シグナル通知のままです。

コンパイラーは、IEEE_EXCEPTIONS または IEEE_ARITHMETIC 組み込みモジュールを使用する有効範囲単位からの呼び出しで、シグナル通知に例外フラグを設定する以外の方法では、浮動小数点数状況が変更されないようにしています。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールを使用する有効範囲単位への入り口でフラグがシグナル通知に設定されると、そのフラグは静止に設定された後、その有効範囲単位を出るときにシグナル通知に復元されます。

IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールを使用する有効範囲単位では、入り口で丸めモードおよび停止モードが変更されることはありません。戻るときには、丸めモードおよび停止モードは入り口のときと同じになります。

宣言式を評価で、例外でシグナル通知が発生する可能性があります。

例外ハンドラーは、IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールを使用してはいけません。

以下の規則は、形式処理および組み込みプロシージャーに適用されます。

IEEE_GET_FLAGIEEE_SET_FLAGIEEE_GET_STATUSIEEE_SET_HALTING、または IEEE_SET_STATUS の呼び出しがない一連のステートメントでは、以下が適用されます。演算の実行によってシグナル通知する例外が発生したが、そのシーケンスを実行した後、変数の値が演算に依存しない場合には、例外がシグナル通知されるかどうかは、最適化レベルに依存します。最適化の変換によって一部のコードが除去される場合があります。そのため、除去されたコードによってシグナル通知された IEEE 例外フラグはシグナル通知されないことになります。

例外は、標準仕様で要求されるか許可される演算の範囲を超える演算の実行の間にだけ、その例外が発生しうる場合には、シグナル通知しません。

Fortran 以外によって定義されたプロシージャーでは、浮動小数点状況を保持するのはユーザーの責任です。

拡張精度値の場合、XL Fortran で常に浮動小数点演算の例外条件が検出されるわけではありません。また、拡張精度を使用するプログラムで浮動小数点演算例外のトラップをオンにすると、例外が実際には発生していない場合でも、シグナルが生成されることがあります。詳細については、 「ユーザーズ・ガイド」の『浮動小数点演算例外の検出とトラップ』を参照してください。

Fortran 2000 IEEE 派生型、定数、および演算子は、xlf_fp_utilfpsets、および fpgets プロシージャーの浮動小数点および照会プロシージャーと互換性がありません。IEEE プロシージャーから取得した値は、非 IEEE プロシージャーでは使用できません。1 つの有効範囲単位内で、xlf_fp_utilfpsets、および fpgets のプロシージャー呼び出しと IEEE プロシージャー呼び出しを混合しないでください。これらのプロシージャーは、 IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールを使用する有効範囲単位から呼び出されるときに、浮動小数点状況を変更します。

例 1: 次の例で、メインプログラムは、IEEE_ARITHMETIC モジュールを使用するプロシージャー P を呼び出します。このプロシージャーは、戻る前に、浮動小数点状況を変更します。例では、プロシージャー P を呼び出す前、プロシージャーへの入り口、P からの出口、およびプロシージャーからの戻り後における、浮動小数点状況の変更が示されています。

PROGRAM MAIN
  USE IEEE_ARITHMETIC
 
  INTERFACE
    SUBROUTINE P()
      USE IEEE_ARITHMETIC
    END SUBROUTINE P
  END INTERFACE
 
  LOGICAL, DIMENSION(5) :: FLAG_VALUES
  TYPE(IEEE_ROUND_TYPE) :: ROUND_VALUE
 
  CALL IEEE_SET_FLAG(IEEE_OVERFLOW, .TRUE.)
 
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "MAIN: FLAGS ",FLAG_VALUES
 
  CALL P()
 
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "MAIN: FLAGS ",FLAG_VALUES
 
  CALL IEEE_GET_ROUNDING_MODE(ROUND_VALUE)
  IF (ROUND_VALUE == IEEE_NEAREST) THEN
    PRINT *, "MAIN: ROUNDING MODE: IEEE_NEAREST"
  ENDIF
END PROGRAM MAIN
 
SUBROUTINE P()
  USE IEEE_ARITHMETIC
  LOGICAL, DIMENSION(5) :: FLAG_VALUES
  TYPE(IEEE_ROUND_TYPE) :: ROUND_VALUE
 
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "   P: FLAGS ON ENTRY: ",FLAG_VALUES
 
  CALL IEEE_SET_ROUNDING_MODE(IEEE_TO_ZERO)
  CALL IEEE_SET_FLAG(IEEE_UNDERFLOW, .TRUE.)
 
  CALL IEEE_GET_ROUNDING_MODE(ROUND_VALUE)
  IF (ROUND_VALUE == IEEE_TO_ZERO) THEN
    PRINT *, "   P: ROUNDING MODE ON EXIT: IEEE_TO_ZERO"
  ENDIF
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "   P: FLAGS ON EXIT: ",FLAG_VALUES
END SUBROUTINE P

IEEE 演算の規則に確実に準拠するようにするために -qstrictieeemod コンパイラー・オプションを使用するとき、 P を呼び出す前に設定された例外フラグは P への入り口でクリアされます。P で発生する浮動小数点状況の変更は、P が戻るときに取り消されます。ただし、例外として、P で設定されたフラグは、P が戻った後も設定されたままです。

 MAIN: FLAGS  T F F F F
    P: FLAGS ON ENTRY:  F F F F F
    P: ROUNDING MODE ON EXIT: IEEE_TO_ZERO
    P: FLAGS ON EXIT:  F F F T F
 MAIN: FLAGS  T F F T F
 MAIN: ROUNDING MODE: IEEE_NEAREST

-qnostrictieeemod コンパイラー・オプションが有効である場合、 P を呼び出す前に設定した例外フラグは、P への入り口でも設定されたままです。P で発生する浮動小数点状況の変更は呼び出し側に伝搬されます。

 MAIN: FLAGS  T F F F F
    P: FLAGS ON ENTRY:  T F F F F
    P: ROUNDING MODE ON EXIT: IEEE_TO_ZERO
    P: FLAGS ON EXIT:  T F F T F
 MAIN: FLAGS  T F F T F

例 2: 次の例で、メインプログラムは、IEEE_ARITHMETICIEEE_EXCEPTIONS のいずれも使用しないプロシージャー Q を呼び出します。プロシージャー Q は、戻る前に、浮動小数点状況を変更します。例では、Q を呼び出す前、プロシージャーへの入り口、Q からの出口、およびプロシージャーからの戻り後における浮動小数点状況の変更が示されています。

PROGRAM MAIN
  USE IEEE_ARITHMETIC
 
  LOGICAL, DIMENSION(5) :: FLAG_VALUES
  TYPE(IEEE_ROUND_TYPE) :: ROUND_VALUE
 
  CALL IEEE_SET_FLAG(IEEE_OVERFLOW, .TRUE.)
 
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "MAIN: FLAGS ",FLAG_VALUES
 
  CALL Q()
 
  CALL IEEE_GET_FLAG(IEEE_ALL, FLAG_VALUES)
  PRINT *, "MAIN: FLAGS ",FLAG_VALUES
 
  CALL IEEE_GET_ROUNDING_MODE(ROUND_VALUE)
  IF (ROUND_VALUE == IEEE_NEAREST) THEN
    PRINT *, "MAIN: ROUNDING MODE: IEEE_NEAREST"
  ENDIF
END PROGRAM MAIN
 
SUBROUTINE Q()
  USE XLF_FP_UTIL
  INTERFACE
    FUNCTION GET_FLAGS()
      LOGICAL, DIMENSION(5) :: GET_FLAGS
    END FUNCTION
  END INTERFACE
 
  LOGICAL, DIMENSION(5) :: FLAG_VALUES
  INTEGER(FP_MODE_KIND) :: OLDMODE
 
  FLAG_VALUES = GET_FLAGS()
  PRINT *, "   Q: FLAGS ON ENTRY: ", FLAG_VALUES
 
  CALL CLR_FPSCR_FLAGS(FP_OVERFLOW)
  OLDMODE = SET_ROUND_MODE(FP_RND_RZ)
  CALL SET_FPSCR_FLAGS(TRP_OVERFLOW)
  CALL SET_FPSCR_FLAGS(FP_UNDERFLOW)
 
  IF (GET_ROUND_MODE() == FP_RND_RZ) THEN
    PRINT *, "   Q: ROUNDING MODE ON EXIT: TO_ZERO"
  ENDIF
 
  FLAG_VALUES = GET_FLAGS()
  PRINT *, "   Q: FLAGS ON EXIT: ", FLAG_VALUES
END SUBROUTINE Q
 
! PRINT THE STATUS OF ALL EXCEPTION FLAGS
FUNCTION GET_FLAGS()
  USE XLF_FP_UTIL
  LOGICAL, DIMENSION(5) :: GET_FLAGS
  INTEGER(FPSCR_KIND), DIMENSION(5) :: FLAGS
  INTEGER I
 
  FLAGS = (/ FP_OVERFLOW, FP_DIV_BY_ZERO, FP_INVALID, &
  &          FP_UNDERFLOW, FP_INEXACT /)
  DO I=1,5
    GET_FLAGS(I) = (GET_FPSCR_FLAGS(FLAGS(I)) /= 0)
  END DO
END FUNCTION

IEEE 演算の規則に確実に準拠するようにするために -qstrictieeemod コンパイラー・オプションを使用するとき、 Q の前に設定された例外フラグは Q への入り口で設定されたままです。 Q で発生する、浮動小数点状況の変更は Q が戻るときに取り消されます。ただし、例外として、Q で設定されたフラグは、Q が戻った後も設定されたままです。

MAIN: FLAGS  T F F F F
    Q: FLAGS ON ENTRY:  T F F F F
    Q: ROUNDING MODE ON EXIT: TO_ZERO
    Q: FLAGS ON EXIT:  F F F T F
 MAIN: FLAGS  T F F T F
 MAIN: ROUNDING MODE: IEEE_NEAREST
 

-qnostrictieeemod オプションが有効である場合、 Q を呼び出す前に設定した例外フラグは、Q への入り口でも設定されたままです。Q で発生する浮動小数点状況の変更は呼び出し側に伝搬されます。

MAIN: FLAGS  T F F F F
    Q: FLAGS ON ENTRY:  T F F F F
    Q: ROUNDING MODE ON EXIT: TO_ZERO
    Q: FLAGS ON EXIT:  F F F T F
 MAIN: FLAGS  F F F T F
 

+--------------------------------IBM 拡張の終り-------------------------------+


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