+----------------------------------IBM 拡張----------------------------------+
XL Fortran は、Fortran 2000 のドラフト標準で指定された IEEE 浮動小数点機能のサポートを提供します。ドラフト標準では、例外に対応する IEEE_EXCEPTIONS モジュール、 IEEE 演算をサポートする IEEE_ARITHMETIC モジュール、およびコンパイラーによってサポートされる IEEE 機能を指定する IEEE_FEATURES が定義されています。
IEEE_EXCEPTIONS または IEEE_ARITHMETIC 組み込みモジュールを使用する場合、 XL Fortran コンパイラーは、丸めモード、停止モード、および例外フラグについての浮動小数点状況に対する変更の有効範囲に関するいくつかの Fortran 2000 のドラフト標準規則を実施しています。このことで、上記のモジュールを使用していても、新しい浮動小数点状況セマンティクスを使用しないプログラムのパフォーマンスが低下する可能性があります。そのようなプログラムに対して、浮動小数点状況の保管と復元に関する規則を緩和するために、-qstrictieeemod コンパイラー・オプションが提供されています。
注:
XL Fortran は、IEEE 標準に完全に準拠するための多くのオプションを提供しています。
export SQRT_EXCEPTION=3.1
IEEE 浮動小数点の詳細、および上記のコンパイラー・オプションの特定の説明については、「ユーザーズ・ガイド」の『XL Fortran 浮動小数点処理』を参照してください。
IEEE_ARITHMETIC、IEEE_EXCEPTIONS、IEEE_FEATURES は組み込みモジュールです。ただし、これらのモジュールで定義されるタイプおよびプロシージャーは組み込みではありません。
IEEE モジュールに含まれるすべての関数は純粋 (PURE) です。
すべてのプロシージャー名は汎用であり、特定ではありません。
すべての例外フラグのデフォルト値は静止です。
デフォルトでは、例外は停止を起こさせません。
丸めモードのデフォルトは、最も近い値への丸めとなります。
IEEE モジュールは、以下の派生型を定義します。
特定の例外フラグを識別する IEEE_EXCEPTIONS モジュールによって定義される派生データ型。IEEE_FLAG_TYPE の値は、IEEE_EXCEPTIONS モジュールで定義される以下の名前付き定数のいずれかである必要があります。
REAL(4) を使用している場合は、結果値の不偏指数が 127 より大か、または -126 より小であるときに、オーバーフローが発生します。
REAL(8) を使用している場合は、結果値の不偏指数が 1023 より大か、または -1022 より小であるときに、オーバーフローが発生します。
REAL(4) を使用している場合は、結果の絶対値が 2-149 より小であるときに、アンダーフローが発生します。
REAL(8) を使用している場合は、結果の絶対値が 2-1074 より小であるときに、アンダーフローが発生します。
以下の定数は、IEEE_FLAG_TYPE の配列です。
現在の浮動小数点状況を表す、IEEE_ARITHMETIC モジュールで定義される派生データ型。浮動小数点状況は、すべての例外フラグ、停止、および丸めモードの値を網羅します。
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_ARITHMETIC モジュールで定義される派生データ型。IEEE_ROUND_TYPE の値は、IEEE_ARITHMETIC モジュールで定義される以下の名前付き定数のいずれかである必要があります。
使用する 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_ARITHMETIC モジュールは、IEEE_CLASS_TYPE または IEEE_ROUND_TYPE の変数を比較するための 2 組のエレメント型演算子を定義します。
以下の IEEE プロシージャーを使用するには、必要に応じて、USE IEEE_ARITHMETIC、USE IEEE_EXCEPTIONS、または USE IEEE_FEATURES ステートメントをソース・ファイルに追加する必要があります。USE ステートメントの詳細については、USEを参照してください。
XL Fortran は、IEEE_FEATURES モジュールのすべての名前付き定数をサポートします。
IEEE_ARITHMETIC モジュールは、IEEE_EXCEPTIONS に対して、USE ステートメントを含んでいるときと同様に動作します。IEEE_EXCEPTIONS で public であるすべての値は、 IEEE_ARITHMETIC でも public のままです。
IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールがアクセス可能である場合、IEEE_OVERFLOW と IEEE_DIVIDE_BY_ZERO はすべての種類の実数および複素数のデータの有効範囲単位内でサポートされます。サポートされている他の例外を判別するには、 IEEE_SUPPORT_FLAG 関数を使用します。停止がサポートされるかどうかを判別するには、IEEE_SUPPORT_HALTING を使用します。他の例外のサポートについては、IEEE_FEATURES モジュールの名前付き定数 IEEE_INEXACT_FLAG、IEEE_INVALID_FLAG、および IEEE_UNDERFLOW_FLAG がアクセス可能かどうかによって、以下のような影響を受けます。
IEEE_EXCEPTIONS または IEEE_ARITHMETIC にアクセスしない有効範囲単位への入り口で例外フラグがシグナル通知される場合、コンパイラーは、出口で、その例外フラグが確実に通知されるようにします。このような有効範囲単位への入り口でフラグが静止である場合は、出口でフラグがシグナル通知される可能性があります。
これ以上の IEEE サポートは、IEEE_ARITHMETIC モジュールを介して取得することができます。サポートは、IEEE_FEATURES モジュールの名前付き定数がアクセス可能かどうかによって影響を受けます。
IEEE_EXCEPTIONS または IEEE_ARITHMETIC モジュールにアクセスし、 IEEE_FEATURES にはアクセスしない場合には、サポートされる機能のサブセットは、 IEEE_FEATURES にアクセスした場合と同じです。
エレメント型 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 符号コピー関数。Y の符号を付けた X の値を戻します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X および Y は実数タイプです。ただし kind は異なる可能性があります。
結果タイプおよび属性
結果は、X と同じ kind およびタイプです。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。
NaN および無限大など、サポートされている IEEE 特殊値に対して、IEEE_COPY_SIGN は Y の符号が付いた X の値を戻します。
IEEE_COPY_SIGN は、-qxlf90=nosignedzero コンパイラー・オプションを無視します。
例
例 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 サブルーチン。指定された、例外フラグの状況を検索します。フラグがシグナル通知である場合に FLAG_VALUE を true に設定し、そうでない場合は false に設定します。
モジュール
IEEE_ARITHMETIC
構文
ここで、FLAG は、取得する IEEE フラグを指定するタイプ IEEE_FLAG_TYPE の INTENT(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 サブルーチン。例外に対する停止モードを検索し、フラグによって指定された例外で停止を起こさせる場合は、HALTING を true に設定します。-qflttrap=imprecise を使用する場合、停止は正確ではなく、例外の後に発生することがあります。デフォルトでは、例外は XL Fortran で停止を起こさせません。
モジュール
IEEE_ARITHMETIC
構文
ここで、FLAG は、IEEE フラグを指定するタイプ IEEE_FLAG_TYPE の INTENT(IN) 引き数です。HALTING は INTENT(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 サブルーチン。ROUND_VALUE を現行の IEEE 丸めモードに設定します。
モジュール
IEEE_ARITHMETIC
構文
ここで、ROUND_VALUE はタイプ IEEE_ROUND_TYPE の INTENT(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 サブルーチン。現行の IEEE 浮動小数点状況を検索します。
モジュール
IEEE_ARITHMETIC
構文
ここで、STATUS_VALUE はタイプ IEEE_STATUS_TYPE の INTENT(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 関数。値が有限であるかどうかを検査します。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 関数。値が 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 関数。値が負であるかどうかを検査します。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 関数。値が正規であるかどうかを検査します。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 関数。浮動小数点形式で不偏指数を戻します。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 関数。Y の方向で、マシンによる表現可能な X の次の近隣を戻します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X および Y は実数タイプです。
結果タイプおよび属性
ここで、結果は X と同じタイプおよび kind です。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) および IEEE_SUPPORT_DATATYPE(Y) は、 true の値を戻す必要があります。
X と Y が等しい場合、関数は、例外をシグナル通知せずに X を戻します。X と Y が等しくない場合には、Y の方向で、マシンによる表現可能な X の次の近隣を戻します。
いずれかの符号のゼロの近隣は、両方とも非ゼロです。
X は有限だが、IEEE_NEXT_AFTER(X, Y) が無限である場合には、 IEEE_OVERFLOW および IEEE_INEXACT がシグナル通知されます。
IEEE_NEXT_AFTER(X, Y) が非正規またはゼロである場合には、 IEEE_UNDERFLOW と IEEE_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 剰余関数。結果値は、丸めモードにかかわりなく、正確に X-Y*N です。ただし、N は X/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 関数。現行の丸めモードに従って、整数値に丸めます。
モジュール
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 関数。X * 2I を戻します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は実数タイプで、I は INTEGER タイプです。
結果タイプおよび属性
ここで、結果は 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 関数。少なくとも 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 サブルーチン。IEEE 例外フラグに値を割り当てます。
モジュール
IEEE_EXCEPTIONS
構文
ここで、FLAG は、設定されるフラグの値に対応するタイプ IEEE_FLAG_TYPE の INTENT(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 サブルーチン。例外の後の継続または停止を制御します。
モジュール
IEEE_EXCEPTIONS
構文
ここで、FLAG は、保留を適用する例外フラグに対応するタイプ IEEE_FLAG_TYPE の INTENT(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 サブルーチン。現行の丸めモードを設定します。
モジュール
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 サブルーチン。浮動小数点状況の値を復元します。
モジュール
IEEE_ARITHMETIC
構文
ここで、STATUS_VALUE は、浮動小数点状況を指定する IEEE_STATUS_TYPE タイプの INTENT(IN) 引き数です。
規則
STATUS_VALUE は IEEE_GET_STATUS で事前に設定されていなければいけません。
照会 IEEE 関数。現行のインプリメンテーションが IEEE 演算をサポートするかどうかを判別します。サポートするとは、オペランドと結果がすべて正規値を持つ場合は必ず、 IEEE 標準に従って、IEEE データ形式を使用し、+、-、および * の 2 進演算を実行するという意味です。
モジュール
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 関数。現行のインプリメンテーションが非正規値をサポートするかどうかを判別します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。
X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが非正規値での算術演算および割り当てをサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。
照会 IEEE 関数。現行のインプリメンテーションが IEEE 標準の精度の除算をサポートするかどうかを判別します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。
X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、IEEE 標準によって指定された精度での除算をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。
照会 IEEE 関数。現行のインプリメンテーションが例外をサポートするかどうかを判別します。
モジュール
IEEE_EXCEPTIONS
構文
ここで、FLAG は IEEE_FLAG_TYPE のスカラー引き数です。X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、指定された例外の検出をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。
X が指定されていない場合、結果は false の値を持ちます。
X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合、結果は true の値を持ちます。
照会 IEEE 関数。例外の発生後に実行を打ち切るための機能または継続するための機能を現行のインプリメンテーションがサポートするかどうかを判別します。現行のインプリメンテーションによるサポートには、IEEE_SET_HALTING(FLAG) を使用して停止モードを変更する機能が含まれます。
モジュール
IEEE_EXCEPTIONS
構文
ここで、FLAG は、IEEE_FLAG_TYPE の INTENT(IN) 引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
結果はすべてのフラグに true の値を戻します。
照会 IEEE 関数。現行のインプリメンテーションが IEEE 無限大機能をサポートするかどうかを判別します。サポートするとは、単項演算および 2 項演算 (組み込み関数および組み込みモジュール内の関数によって定義されるものを含む) の IEEE 無限大動作が IEEE 標準に準拠することを言います。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。
X が指定されていない実数タイプのすべての引き数に対して、または X と同じ kind 型付きパラメーターの実変数に対して、インプリメンテーションが、IEEE の正と負の無限大をサポートする場合には、結果は true の値を持ちます。それ以外の場合は、結果は false の値を持ちます。
X が REAL(16) タイプである場合には、結果は false の値を持ちます。それ以外の場合、結果は true の値を持ちます。
照会 IEEE 関数。現行のインプリメンテーションが IEEE ベースの変換丸めをサポートするかどうかを判別します。サポートするとは、X が不在の、実数タイプのすべての引き数の IEEE_UP、IEEE_DOWN、IEEE_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 関数。現行のインプリメンテーションが IEEE 非数値機能をサポートするかどうかを判別します。サポートするとは、単項演算および 2 進演算 (組み込み関数および組み込みモジュール内の関数によって定義されるものを含む) の IEEE NaN 動作が IEEE 標準に準拠するという意味です。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
Fortran 2000 ドラフト標準に確実に準拠するようにするには、IEEE_SUPPORT_DATATYPE(X) は、true の値を戻す必要があります。
X が指定されていない場合、結果は false の値を持ちます。
X が指定され、REAL(16) タイプである場合、結果は false の値を持ちます。それ以外の場合は、結果は true の値を戻します。
照会 IEEE 関数。現行のインプリメンテーションが実数タイプの引き数の特定の丸めモードをサポートするかどうかを判別します。サポートするとは、IEEE_SET_ROUNDING_MODE を使用した、丸めモードを変更する機能を言います。
モジュール
IEEE_ARITHMETIC
構文
ここで、ROUND_VALUE は IEEE_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_VALUE が IEEE_NEAREST の値を持つときには、結果は false の値を戻します。それ以外の場合は、結果は true の値を戻します。
ROUND_VALUE が IEEE_OTHER の値を持つときには、結果は false の値を持ちます。
照会 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 関数。Fortran 2000 ドラフト標準で定義されたすべての機能がサポートされるかどうかを判別します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は、実数タイプのスカラーまたは配列値引き数です。
結果タイプおよび属性
結果は、デフォルト論理タイプのスカラーです。
規則
X が指定されていない場合、XL Fortran は REAL(16) をサポートするので、結果は false の値を戻します。
X が指定されている場合、以下の関数も true を戻せば、結果は true の値を戻します。
それ以外の場合は、結果は false の値を持ちます。
エレメント型 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 関数。CLASS によって指定された IEEE 値を生成します。
モジュール
IEEE_ARITHMETIC
構文
ここで、X は実数タイプです。 CLASS は IEEE_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_NAN の CLASS 値でこのプログラムを呼び出す場合、コンパイル単位は -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_FLAG、IEEE_SET_FLAG、IEEE_GET_STATUS、IEEE_SET_HALTING、または IEEE_SET_STATUS の呼び出しがない一連のステートメントでは、以下が適用されます。演算の実行によってシグナル通知する例外が発生したが、そのシーケンスを実行した後、変数の値が演算に依存しない場合には、例外がシグナル通知されるかどうかは、最適化レベルに依存します。最適化の変換によって一部のコードが除去される場合があります。そのため、除去されたコードによってシグナル通知された IEEE 例外フラグはシグナル通知されないことになります。
例外は、標準仕様で要求されるか許可される演算の範囲を超える演算の実行の間にだけ、その例外が発生しうる場合には、シグナル通知しません。
Fortran 以外によって定義されたプロシージャーでは、浮動小数点状況を保持するのはユーザーの責任です。
拡張精度値の場合、XL Fortran で常に浮動小数点演算の例外条件が検出されるわけではありません。また、拡張精度を使用するプログラムで浮動小数点演算例外のトラップをオンにすると、例外が実際には発生していない場合でも、シグナルが生成されることがあります。詳細については、 「ユーザーズ・ガイド」の『浮動小数点演算例外の検出とトラップ』を参照してください。
Fortran 2000 IEEE 派生型、定数、および演算子は、xlf_fp_util、fpsets、および fpgets プロシージャーの浮動小数点および照会プロシージャーと互換性がありません。IEEE プロシージャーから取得した値は、非 IEEE プロシージャーでは使用できません。1 つの有効範囲単位内で、xlf_fp_util、fpsets、および 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_ARITHMETIC と IEEE_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 拡張の終り-------------------------------+