ナビゲーション:前へ 上へ 次へ
ナビゲーション:前へ 上へ 次へ
6.6 IEEE_ARITHMETICモジュール
IEEE算術をサポートする追加関数を提供します。 その中にはすべてのIEEE_EXCEPTIONSが含まれます。6.6.1 IEEEデータ型選択
IEEE_SELECTED_REAL_KIND関数はSELECTED_REAL_KIND組込み関数と似ていますが、 IEEEに準拠したREAL型のみを選択し準拠していないものを無視します。6.6.2 調査関数
PURE LOGICAL FUNCTION IEEE_SUPPORT_DATATYPE()すべての実変数XがIEEE_SUPPORT_DATATYPE(X)の条件を満たすかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_DATATYPE(X) REAL(*),INTENT(IN) :: XXの種別の変数が以下の条件を満たすかどうかを返します:
- 絶対値がTINY(X)とHUGE(X)の間の数値がIEEE浮動小数点形式のものである。
- +、-、*演算が最低一つの丸めモードに対するIEEEに準拠している。
- 関数IEEE_COPY_SIGN, IEEE_LOGB, IEEE_NEXT_AFTER, IEEE_REM, IEEE_SCALB, IEEE_UNORDEREDが利用可能である。
PURE LOGICAL FUNCTION IEEE_SUPPORT_DENORMAL() PURE LOGICAL FUNCTION IEEE_SUPPORT_DENORMAL(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数において (絶対値がゼロとTINYの間の)非正規値がIEEEで必要とされる通りに存在し、 それらに対する演算がIEEEに準拠しているかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_DIVIDE() PURE LOGICAL FUNCTION IEEE_SUPPORT_DIVIDE(X) REAL(*),INTENT(IN) :: X組込み除算(/)がすべての実種別もしくはXの種別を持つ変数に対しIEEE準拠かどうかをそれぞれ返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_INF() PURE LOGICAL FUNCTION IEEE_SUPPORT_INF(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 正及び負の無限大値が存在しIEEEに準拠した動作をするかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_IO() PURE LOGICAL FUNCTION IEEE_SUPPORT_IO(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 書式付き入出力に際してのテキストからおよびテキストへの変換が、入出力丸めモード'DOWN', 'NEAREST', 'UP', 'ZERO'に関しIEEEに準拠するかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_NAN() PURE LOGICAL FUNCTION IEEE_SUPPORT_NAN(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 正及び負の“Not-a-Number”値が存在し、IEEEに準拠するかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_ROUNDING(ROUND_VALUE) TYPE(IEEE_ROUND_TYPE),INTENT(IN) :: ROUND_VALUE PURE LOGICAL FUNCTION IEEE_SUPPORT_ROUNDING(ROUND_VALUE,X) TYPE(IEEE_ROUND_TYPE),INTENT(IN) :: ROUND_VALUE REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 ROUND_VALUEで示される丸めモードがIEEE_SET_ROUNDING_MODEを使って設定でき、 IEEEに準拠するかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_SQRT() PURE LOGICAL FUNCTION IEEE_SUPPORT_SQRT(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 組込み関数(SQRT)がIEEEに準拠するかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_STANDARD() PURE LOGICAL FUNCTION IEEE_SUPPORT_STANDARD(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 IEEEモジュールで記述されるすべての機能(入出力変換(IEEE_SUPPORT_IO参照)を除く)がサポートされ且つIEEEに準拠するかどうかを返します。
PURE LOGICAL FUNCTION IEEE_SUPPORT_UNDERFLOW_CONTROL() PURE LOGICAL FUNCTION IEEE_SUPPORT_UNDERFLOW_CONTROL(X) REAL(*),INTENT(IN) :: Xすべての実種別もしくはXの種別を持つ変数に対し、 アンダーフローモードがIEEE_SET_UNDERFLOW_MODEで制御できるかどうかを返します。
6.6.3 丸めモード
TYPE IEEE_ROUND_TYPEこの型の値はIEEE丸めモードを指定します。以下の既定の定数が提供されます。
IEEE_DOWN | 切り下げる (負の無限大に向けて) |
IEEE_NEAREST | 四捨五入する |
IEEE_TO_ZERO | 正の数は切り下げる、負の数は切り上げる |
IEEE_UP | 切り上げる (正のの無限大に向けて) |
IEEE_OTHER | 他の丸めモード |
PURE SUBROUTINE IEEE_GET_ROUNDING_MODE(ROUND_VALUE) TYPE(IEEE_ROUND_TYPE),INTENT(OUT) :: ROUND_VALUEROUND_VALUEに現在の丸めモードを設定します。
PURE SUBROUTINE IEEE_SET_ROUNDING_MODE(ROUND_VALUE) TYPE(IEEE_ROUND_TYPE),INTENT(IN) :: ROUND_VALUE丸めモードをROUND_VALUEで示されるものに設定します。
6.6.4 アンダーフローモード
アンダーフローモードには、 IEEE標準で規定される“緩やかなアンダーフロー(gradual underflow)”とそうでない“急激なアンダーフロー(abrupt underflow)”の2種類があります。緩やかなアンダーフローの場合、 -TINY(X)とTINY(X)の空隙は均等に配置された非正規数(“subnormal” numbers)によって満たされます。 これらの数の間隔はTINY(X)の上の部分における数体系上の数の間隔に等しく設定されます (それは最小の非正規数に等しいものでもあります)。 これによって数が0に近づくときの精度の劣化が緩やかなものとなります。 最小の数は1ビットの精度しか持たないため、そのような値に対する計算は非常に大きな相対誤差を持つことになります。
急激なアンダーフローの場合、-TINY(X)とTINY(X)の間にある値は0のみとなります。 この種のアンダーフローは非IEEE算術の世界では極めて普遍的であり、 IEEE算術の場合にも広くハードウェアによってサポートされています。 その主たる優位点はその高速性にあります。
SUBROUTINE IEEE_GET_UNDERFLOW_MODE(GRADUAL) LOGICAL,INTENT(OUT) :: GRADUAL現行のアンダーフローモードが緩やかなアンダーフローの場合にGRADUALを.TRUE.にセット、 急激なアンダーフローの場合には.FALSE.にセットします。
SUBROUTINE IEEE_SET_UNDERFLOW_MODE(GRADUAL) LOGICAL,INTENT(IN) :: GRADUALGRADUALが.TRUE.の場合にアンダーフローモードを緩やかなアンダーフローに、 .FALSE.の場合には急激なアンダーフローに設定します。
6.6.5 数の分類
TYPE IEEE_CLASS_TYPEこの型の値は数のIEEE区分を示します。これは以下のいずれかの定数です:
IEEE_NEGATIVE_DENORMAL | −TINY(x)<x<0 の範囲にある負の非正規数 x |
IEEE_NEGATIVE_INF | −無限大(負の無限大) |
IEEE_NEGATIVE_NORMAL | −HUGE(x)≤x≤−TINY(x) の範囲にある負の正規数 x |
IEEE_NEGATIVE_ZERO | −0 |
IEEE_POSITIVE_DENORMAL | 0<x<TINY(x) の範囲にある正の非正規数 x |
IEEE_POSITIVE_INF | +無限大(正の無限大) |
IEEE_POSITIVE_NORMAL | TINY(x)≤x≤HUGE(x) の範囲にある正の正規数 x |
IEEE_POSITIVE_ZERO | +0 |
IEEE_QUIET_NAN | Not-a-Number(通常は不正な演算の結果) |
IEEE_SIGNALING_NAN | 参照で無効なシグナルを発するNot-a-Number |
IEEE_OTHER_VALUE | 上記のいずれにも当てはまらないその他の値 |
比較演算子.EQ. (=) と .NE. (/=) はこの型の値を比較するために提供されます。
ELEMENTAL TYPE(IEEE_CLASS_TYPE) FUNCTION IEEE_CLASS(X) REAL(*),INTENT(IN) :: XXの値の分類を返します。
ELEMENTAL REAL(*) FUNCTION IEEE_VALUE(X,CLASS) REAL(*),INTENT(IN) :: X TYPE(IEEE_CLASS_TYPE),INTENT(IN) :: CLASSCLASSで示される区分とXの種別を持つ“sample”値を返します。
6.6.6 検査関数
以下の手続きがIEEEの値を検査するために提供されます。
ELEMENTAL LOGICAL FUNCTION IEEE_IS_FINITE(X) REAL(*),INTENT(IN) :: XXが“有限”(無限大、非数、IEEE_OTHER_VALUEでない)であるかどうかを返します。
ELEMENTAL LOGICAL FUNCTION IEEE_IS_NAN(X) REAL(*),INTENT(IN) :: XXが非数かどうかを返します。
ELEMENTAL LOGICAL FUNCTION IEEE_IS_NEGATIVE(X) REAL(*),INTENT(IN) :: XXが負であるかどうかを返します。比較X<0との違いは負のゼロの場合のみで、 その場合には.TRUE.が応答として返されます。
ELEMENTAL LOGICAL FUNCTION IEEE_UNORDERED(X,Y) REAL(*),INTENT(IN) :: X,Y‘IEEE_IS_NAN(X) .OR. IEEE_IS_NAN(Y)’の値を返します。
6.6.7 算術関数
ELEMENTAL REAL(*) FUNCTION IEEE_COPY_SIGN(X,Y) REAL(*),INTENT(IN) :: X,YYの符号ビットを持つXを返します。
ELEMENTAL REAL(*) FUNCTION IEEE_LOGB(X) REAL(*),INTENT(IN) :: XXがゼロの場合、無限大がサポートされていれば−無限大を、 そうでない場合には-HUGE(X)を返します。 Xがゼロでない場合にはEXPONENT(X)-1を返します。
ELEMENTAL REAL(*) FUNCTION IEEE_NEXT_AFTER(X,Y) REAL(*),INTENT(IN) :: X,YXに一番近い数でYにより近い数を返します。 XとYが等しい場合にはXを返します。
ELEMENTAL REAL(*) FUNCTION IEEE_REM(X,Y) REAL(*),INTENT(IN) :: X,YXをYで割った際の正確な余りを返します。
ELEMENTAL REAL(*) FUNCTION IEEE_RINT(X) REAL(*),INTENT(IN) :: XXを現在の丸めモードにしたがって丸めた整数値を返します。
ELEMENTAL REAL(*) FUNCTION IEEE_SCALB(X,I) REAL(*),INTENT(IN) :: X INTEGER(*),INTENT(IN) :: ISCALE(X,I)を返します。
ナビゲーション:前へ 上へ 次へ