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_MODEGRADUALに対する基本種別の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)
結果の値は、NaNを無視した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)が偽を返す場合には呼び出してはなりません。
