11.9 更新されたIEEE算術機能
以下の機能は7.0で利用可能でした。
-
[7.0]
モジュール
IEEE_ARITHMETIC
には、新しい関数IEEE_NEXT_DOWN
とIEEE_NEXT_UP
が含まれます。 これらは単一の引数を持つ要素であり、IEEE種別のREAL
である必要があります(つまり、IEEE_SUPPORT_DATATYPE
はその種別のREAL
に対して.TRUE.
を返す必要があります)。 これらは、引数と等しくない次のIEEE値を、それぞれ下方向と上方向に関して返します。 ただし、−∞からの次の下方向は−∞自体であり、+∞からの上方向は+∞自体です。 これらの関数は、引数がシグナリングNaN(この場合はIEEE_INVALID
がシグナリングされる)でない限り、 例外を通知しないという点で、古いIEEE_NEXT_AFTER
関数よりも優れています。たとえば、
IEEE_NEXT_UP(-0.0)
とIEEE_NEXT_UP(+0.0)
はどちらも、IEEE_UNDERFLOW
を通知せずに、最小の正の非正規値を返します(非正規値がサポートされている場合(IEEE_NEXT_AFTER
はこれをサポートする))。同様に、
IEEE_NEXT_UP(HUGE(0.0))
は、シグナリングオーバーフローなしで+∞を返します。 -
[7.0] モジュール
IEEE_ARITHMETIC
には、新しい名前付き定数IEEE_NEGATIVE_SUBNORMAL
、IEEE_POSITIVE_SUBNORMAL
、および新しい関数IEEE_SUPPORT_SUBNORMAL
が含まれます。 これらはFortran2018からのものであり、2008年のIEEE算術標準の用語の変更を反映しています。 これらは、古い関数IEEE_NEGATIVE_DENORMAL
、IEEE_POSITIVE_DENORMAL
、およびIEEE_SUPPORT_DENORMAL
と同等です。 -
[7.0]
IEEE_GET_FLAG
およびIEEE_SET_FLAG
に対するFLAG_VALUE
引数、IEEE_GET_HALTING_MODE
およびIEEE_SET_HALTING_MODE
に対するHALTING
引数、IEEE_GET_UNDERFLOW_MODE
およびIEEE_SET_UNDERFLOW_MODE
GRADUAL
に対する基本種別のLOGICAL
はそれぞれ必須ではなくなり、あらゆる種別のLOGICAL
が許可されるようになりました。例)
USE F90_KIND USE IEEE_ARITHMETIC LOGICAL(byte) flags(SIZE(IEEE_ALL)) CALL IEEE_GET_FLAG(IEEE_ALL,flags)
上記は現在のIEEEフラグを1バイトのLOGICAL
の配列に格納します。
これらの項目はリリース7.2で利用可能です:
-
名前付き定数
IEEE_AWAY
はIEEE_ROUND_TYPE
型であり、ゼロから遠ざかる方法で最も近い値に丸める丸めモードを表します。 IEEE標準では、この丸めモードは10進数に対してのみ要求され、 2進数のハードウェアはこれをサポートしていないため、使用することはできません。 -
要素別関数
IEEE_FMA
は、融合乗算加算操作を実行します。 その構文は以下の通りです:IEEE_FMA (A, B, C)
A
: 実数型(任意のIEEE種別);
B
:A
と同じ型および種別;
C
:A
と同じ型および種別。結果 :
A
と同じ型および種別。この関数の結果は、(
A
×B
)+C
の値で、丸めは1回だけ行われます; つまり、全操作は数学的に計算され、最後にA
の形式に丸められます。 例えば、A
×B
がオーバーフローしてもIEEE_OVERFLOW
は通知されませんが、 最終結果が範囲外の場合にのみ通知されます。制限: この関数は、
A
の種別がIEEE形式でない場合、つまりIEEE_SUPPORT_DATATYPE (A)
が偽を返す場合には呼び出してはなりません。 -
純粋サブルーチン
IEEE_GET_MODES
は、停止モード、丸めモード、およびアンダーフローモードを 単一のオブジェクトで取得します。 その構文は以下の通りです:IEEE_GET_MODES (MODES)
MODES
:IEEE_MODES_TYPE
型のスカラ、Intent(Out)
。IEEE_SET_MODES
によってモードを復元するために使用することができます。 -
純粋サブルーチン
IEEE_GET_ROUNDING_MODE
は、現在の丸めモードを取得し、 基数を指定するオプション引数が追加されました。 そのため、構文は以下のようになります:IEEE_GET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE
:IEEE_ROUND_TYPE
型、Intent(Out);
RADIX
(オプション) : 整数型、Intent(In)、2または10に等しくなければならない。ROUND_VALUE
引数には、指定された基数の現在の丸めモードが割り当てられます。RADIX
が省略された場合は、2進数の丸めモードが割り当てられます。 -
要素別関数
IEEE_INT
は、IEEE実数値を特定の丸めモードで整数に変換します。 その構文は以下の通りです:IEEE_INT (A, ROUND [, KIND ])
A
: 実数型;
ROUND
:IEEE_ROUND_TYPE
型;
KIND
(オプション) : スカラ整数定数式;
結果 : 整数型、KIND
が指定されている場合はその種別、そうでなければデフォルトの種別。A
の値は、ROUND
で指定された丸めモードを使用して整数に丸められます。 その値が結果の種別で表現可能であれば、結果はその値を持ちます。 そうでなければ、結果は処理系依存であり、IEEE_INVALID
が通知されます。この操作は、IEEE標準で指定された
convertToInteger{round}
またはconvertToIntegerExact{round}
操作のいずれかです。 後者の場合、IEEE_INVALID
が通知されず、A
がすでに整数でなかった場合、IEEE_INEXACT
が通知されます。制限: この関数は、
A
の種別がIEEE形式でない場合、つまりIEEE_SUPPORT_DATATYPE (A)
が偽を返す場合には呼び出してはなりません。 -
要素別関数
IEEE_MAX_NUM
,IEEE_MAX_NUM_MAG
,IEEE_MIN_NUM
,IEEE_MIN_NUM_MAG
は、NaN値を無視して最大/最小操作を実行します。 引数がシグナリングNaNである場合、IEEE_INVALID
が発生します。 1つの引数のみがNaNの場合、結果は他の引数です。 両方の引数がNaNの場合のみ、結果はNaNです。IEEE_MAX_NUM
の構文は以下の通りです:IEEE_MAX_NUM (X, Y)
X
: 実数型;
Y
:X
と同じ型および種別;
結果 :X
と同じ型および種別。X
とY
の最大値です。制限: この関数は、
X
の種別がIEEE形式でない場合、つまりIEEE_SUPPORT_DATATYPE (X)
が偽を返す場合には呼び出してはなりません。IEEE_MAX_NUM_MAG
は同じ構文(名前を除く)を持ち、 結果はX
とY
のうち大きな大きさを持つ方です。 同じ制限が適用されます。IEEE_MIN_NUM
は同じ構文(名前を除く)を持ち、 結果はNaNを無視したX
とY
の最小値です。 同じ制限が適用されます。IEEE_MIN_NUM_MAG
は同じ構文(名前を除く)を持ち、 結果はX
とY
のうち小さな大きさを持つ方です。 同じ制限が適用されます。 -
派生型
IEEE_MODES_TYPE
には、すべての浮動小数点モードが含まれています: 停止モード、丸めモード、およびアンダーフローモード。 これは、IEEE_GET_MODES
およびIEEE_SET_MODES
サブルーチンによって使用されます。 -
要素別関数
IEEE_QUIET_
{EQ
|NE
|LT
|LE
|GT
|GE
} は、オペランドがクワイエットNaNであってもシグナルを発生させずに、2つのIEEE形式の数値を比較します。 オペランドがシグナリングNaNの場合、IEEE_INVALID
例外が発生します。IEEE_QUIET_EQ
とIEEE_QUIET_NE
は、==
と/=
と全く同じですが、 IEEE形式の数値にのみ使用できます。IEEE_QUIET_EQ
関数の構文は以下の通りです:IEEE_QUIET_EQ (A, B)
A
: 実数型(任意のIEEE種別);
B
:A
と同じ型および種別;結果 : デフォルト種別の論理型。
IEEE_QUIET_NE
などの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別がIEEE形式でない場合、つまり
IEEE_SUPPORT_DATATYPE (X)
が偽を返す場合には呼び出してはなりません。 -
要素別関数
IEEE_REAL
は、整数またはIEEE形式の実数値を 指定されたIEEE形式の実数値に変換します。 その構文は以下の通りです:IEEE_REAL (A, [, KIND ])
A
: 実数型または整数型;
KIND
(オプション) : スカラ整数定数式;
結果 : 実数型、KIND
が指定されている場合はその種別、そうでなければデフォルトの種別。A
の値が結果の種別で表現可能であれば、その値が結果となります。 そうでなければ、A
の値は現在の丸めモードを使用して結果の種別に丸められます。制限: この関数は、
A
または結果の種別がIEEE形式でない場合、つまりIEEE_SUPPORT_DATATYPE (A)
またはIEEE_SUPPORT_DATATYPE(REAL(0,KIND))
が偽を返す場合には呼び出してはなりません。 -
要素別関数
IEEE_RINT
は、IEEE数をその形式を変更せずに整数に丸めますが、 必要な丸めを指定するオプション引数ROUND
が追加されました。 改訂された構文は以下の通りです:IEEE_RINT (X [, ROUND ])
X
: 実数型(任意のIEEE種別);
ROUND
(オプション) :IEEE_ROUND_TYPE
型。結果 :
X
と同じ型および種別。ROUND
が存在する場合、結果はROUND
によって指定されたモードに従ってX
を整数に丸めた値です。これはIEEE標準がroundToIntegral{rounding}
と呼ぶ操作です。ROUND
が存在しない場合、結果は現在の丸めモードに従ってX
を整数に丸めた値です。これはIEEE標準がroundToIntegralExact
と呼ぶ操作です。制限: この関数は、
X
の種別がIEEE形式でない場合、つまりIEEE_SUPPORT_DATATYPE (X)
が偽を返す場合には呼び出してはなりません。 -
純粋サブルーチン
IEEE_SET_MODES
は、前回IEEE_GET_MODES
を呼び出したときの状態に停止モード、丸めモード、およびアンダーフローモードを設定します。 その構文は以下の通りです:IEEE_SET_MODES (MODES)
MODES
:IEEE_MODES_TYPE
型のスカラ、Intent(In)
。MODES
の値は、IEEE_GET_MODES
を介して取得されたものでなければなりません。 -
純粋サブルーチン
IEEE_SET_ROUNDING_MODE
は、丸めモードを設定しますが、 基数を指定するオプション引数が追加されました。 そのため、構文は以下のようになります:IEEE_SET_ROUNDING_MODE (ROUND_VALUE [, RADIX ])
ROUND_VALUE
:IEEE_ROUND_TYPE
型、Intent(In);
RADIX
(オプション) : 整数型、Intent(In)、2または10に等しくなければならない。指定された基数の丸めモードが
ROUND_VALUE
に設定されます。RADIX
が存在しない場合、2進数の丸めモードが設定されます。制限: このサブルーチンは、いくつかの
X
(基数RADIX
が存在する場合はその基数)に対して、IEEE_SUPPORT_DATATYPE(X)
とIEEE_SUPPORT_ROUNDING(ROUND_VALUE,X)
が真である場合にのみ呼び出してください。 -
要素別関数
IEEE_SIGNALING_
{EQ
|NE
|LT
|LE
|GT
|GE
} は、2つのIEEE形式の数値を比較し、 オペランドがNaN(クワイエットまたはシグナリング)である場合にIEEE_INVALID
例外を発生させます。IEEE_SIGNALING_LT
,IEEE_SIGNALING_LE
,IEEE_SIGNALING_GT
, およびIEEE_SIGNALING_GE
は、<
,<=
,>
, および>=
と全く同じですが、 IEEE形式の数値にのみ使用できます。IEEE_SIGNALING_EQ
関数の構文は以下の通りです:IEEE_SIGNALING_EQ (A, B)
A
: 実数型(任意のIEEE種別);
B
:A
と同じ型および種別;結果 : デフォルト種別の論理型。
IEEE_SIGNALING_NE
などの構文は、関数の名前を除いて同じです。制限: これらの関数は、X の種別がIEEE形式でない場合、つまり
IEEE_SUPPORT_DATATYPE (X)
が偽を返す場合には呼び出してはなりません。 -
要素別関数
IEEE_SIGNBIT
は、IEEE形式の数値の符号ビットを照会します。 その構文は以下の通りです:IEEE_SIGNBIT (X)
X
: 実数型(任意の種別);結果 : デフォルト種別の論理型。
結果は、符号ビットが設定されている場合(NaNでない任意の値の負を示す)に限り、真です。
制限: この関数は、X の種別がIEEE形式でない場合、つまり
IEEE_SUPPORT_DATATYPE (X)
が偽を返す場合には呼び出してはなりません。