nAG Fortran コンパイラ 7.2 マニュアル

 
ナビゲーション:前へ   上へ   次へ

11.9 更新されたIEEE算術機能

以下の機能は7.0で利用可能でした。

  • [7.0] モジュールIEEE_ARITHMETICには、新しい関数IEEE_NEXT_DOWNIEEE_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_SUBNORMALIEEE_POSITIVE_SUBNORMAL、および新しい関数IEEE_SUPPORT_SUBNORMALが含まれます。 これらはFortran2018からのものであり、2008年のIEEE算術標準の用語の変更を反映しています。 これらは、古い関数IEEE_NEGATIVE_DENORMALIEEE_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_AWAYIEEE_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 と同じ型および種別。

    結果の値は、NaNを無視した XY の最大値です。

    制限: この関数は、X の種別がIEEE形式でない場合、つまり IEEE_SUPPORT_DATATYPE (X) が偽を返す場合には呼び出してはなりません。

    IEEE_MAX_NUM_MAG は同じ構文(名前を除く)を持ち、 結果は XY のうち大きな大きさを持つ方です。 同じ制限が適用されます。

    IEEE_MIN_NUM は同じ構文(名前を除く)を持ち、 結果はNaNを無視した XY の最小値です。 同じ制限が適用されます。

    IEEE_MIN_NUM_MAG は同じ構文(名前を除く)を持ち、 結果は XY のうち小さな大きさを持つ方です。 同じ制限が適用されます。

  • 派生型 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_EQIEEE_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) が偽を返す場合には呼び出してはなりません。

Privacy Policy  /  Trademarks