10.6 組込み手続と組込みモジュール
10.6.1 追加された数学の組込関数 [大部分 5.3.1]
-
要素別処理組込関数
ACOSH
,ASINH
,ATANH
は 逆双曲線余弦、逆双曲線正弦、逆双曲線正接をそれぞれ計算します。 一つの引数であるX
はReal型もしくはComplexで、結果は引数と同じ型と種別となります。 引数がComplexの場合には虚数部はラジアンで表現され、 0≤im≤π の範囲(ACOSH
の場合)もしくは −π/2≤im≤π/2 の範囲(ASINH
とATANH
の場合)の値をとります。例えば
ACOSH(1.543081)
、ASINH(1.175201)
、ATANH(0.7615942)
は全てほぼ1.0
となります。 -
[6.1]
要素別組込み関数
BESSEL_J0
,BESSEL_Y0
,BESSEL_J1
及びBESSEL_Y1
はベッセル関数 J0, Y0, J1 及び Y1 をそれぞれ計算します。 これらの関数はベッセルの微分方程式です。 J関数は第一種、Y関数は第二種をそれぞれ示しそれに続く添字は(0もしくは1)はオーダーを表します。 引数X
は実数型でなければならず、関数の結果はそれと同じ型及び種別となります。 第二種の関数(BESSEL_Y0
及びBESSEL_Y1
)では引数X
は正でなければなりません。例)
BESSEL_J0(1.5)
は大凡0.5118276
,BESSEL_Y0(1.5)
は大凡0.3824489
,BESSEL_J1(1.5)
は大凡0.5579365
,BESSEL_Y1(1.5)
は大凡-0.4123086
-
[6.1]
組込み関数
BESSEL_JN
及びBESSEL_YN
はベッセル関数Jn 及び Yn をそれぞれ計算します。 これらの関数は要素別と変形の2つの形式を持ちます。要素別の形式である場合、2つの引数を持ちます。
N
は計算する関数のオーダーを指定し、X
, はベッセル関数の引数を指定します。BESSEL_JN(0,X)
はBESSEL_J0(X)
等と同等です。変形の形式である場合、
N1
,N2
及びX
の3つの引数を持ちます。 結果は大きさMAX(N2-N1+1,0)
でオーダーN1
からN2
が適用されたベッセル関数X
のベクトルとなります。例)
BESSEL_JN(5,7.5)
は大凡0.283474
,BESSEL_YN(5,7.5)
は大凡0.175418
,BESSEL_JN(3,5,7.5)
は大凡[ -0.258061, 0.023825, 0.283474 ]
,BESSEL_YN(3,5,7.5)
は大凡[ 0.159708, 0.314180, 0.175418 ]
-
[6.0] 要素別組込関数
ERF
、ERFC
、及びERFC_SCALED
は誤差関数、相補誤差関数、及びスケーリング相補誤差関数をそれぞれ計算します。 一つの引数X
は実数型でなければならず、結果は引数と同じ型と種別となります。誤差関数は −t2 (範囲0から
X
× 2/SQRT
(π))です。 これは早くに1に収束します。 相補誤差関数は 1-誤差関数で比較的早くに0に収束します。 スケーリング相補誤差関数は 1-誤差関数 の値をEXP
(X
**2) でスケーリングします。 この値も0に収束しますが、ゆっくりと収束します。 -
[6.0] 要素別組込関数
GAMMA
とLOG_GAMMA
はガンマ関数とその絶対値の自然対数をそれぞれ計算します。 一つの引数X
は実数型でなければならず、ゼロもしくは負の整数であってはなりません。ガンマ関数は階乗の計算を実数へ拡張したものです。正の整数に関してはこの関数は(
X
−1)!と同等です。(X
-1の階乗) この計算は早い段階で(比較的小さなX
で)オーバーフローとなります。LOG_GAMMA
も発散しますがその速度を遅いです。 -
要素別処理組込関数
HYPOT
は引数X
とY
の “ユークリッド距離関数” (二乗和の平方根) をX
もしくはY
が非常に大きな値もしくは小さな値であったような場合でもオーバーフローやアンダーフローを起こすことなく計算します。 (結果自体がオーバーフローもしくはアンダーフローである場合はこの限りではありません) 引数は同じ種別のReal型でなければならず、結果はその同じ種別の型となります。HYPOT(X,Y)
は意味としても数値としてもABS(CMPLX(X,Y,種別(X)))
と同等です。例えば
HYPOT(3e30,4e30)
は5e30
とほぼ同等です。 -
配列集計組込関数
NORM2(X,DIM)
は足し算や掛け算で集計を行うSUM
とPRODUCT
と同じような動きをしますが、 L2ノルム(平方和の平方根)により集計を行います。 その他の多くの集計関数と異なりNORM2
にはMASK
引数が無い点に注意して下さい。DIM
引数は省略可能です。DIM
の実引数はそれ自身が省略可能な仮引数であってはなりません。結果の値の計算は、結果自体が最大範囲外である場合を除き、計算途中におけるオーバーフローやアンダーフローを避けるように行われます。 例えば
NORM2([X,Y])
はHYPOT(X,Y)
とほぼ同等です。
10.6.2 ビット操作のための新たな組込関数 [大凡 5.3]
-
要素別組込関数
BGE
,BGT
,BLE
,BLT
はビット毎の(つまり符号無しの)比較を行います。 またこれらの関数は2つの整数型(異なる種別であっても良い)の引数I
、J
を持ち、基本論理型を返します。例えば
BGE(INT(Z'FF',INT8),128)
は真となり、INT(Z'FF',INT8)>=128
は偽となります。 -
[5.3.1]
要素別処理組込関数
DSHIFTL
とDSHIFTR
は倍幅移動を行います。 これらの関数は3つの引数I
,J
,SHIFT
を持ち、I
もしくはJ
に非10進定数表現が許されている事を除き、それぞれInteger型である必要があります。 非10進定数表現は非10進定数表現を指定しなかった方(I
もしくはJ
)の型と種別に変換されます。I
とJ
は両方共がInteger型である場合、同じ種別でなければなりません。 結果はI
とJ
と同じ種別のInteger型となります。I
とJ
は連結されて一つの倍幅の値が形成され、 そしてその値が右方向にSHIFT
位置分移動するような振る舞いとなります。DSHIFTL
の結果は上位半分の結合移動となり、DSHIFTR
の結果は下位半分の結合移動となります。例えば
DSHIFTL(INT(B'11000101',1),B'11001001',2)
はINT(B'00010111',1)
(10進数の23)となり、DSHIFTR(INT(B'11000101',1),B'11001001',2)
はINT(B'01110010',1)
(10進数の114)となります。 -
配列集計組込関数
IALL
,IANY
,IPARITY
はビットワイズの演算で配列を集計します。 これらはSUM
及びPRODUCT
と似た動作をし、SUM
及びPRODUCT
がそれぞれ+
もしくは*
演算により集計を行うのに対してIALL
,IANY
,IPARITY
はそれぞれIAND
,IOR
,IEOR
により集計を行います。 つまりそれぞれの要素がビットワイズの論理積、論理和、排他的論理和により集計されます。IANY
とIPARITY
で集計対象要素が一つもない場合の結果はゼロとなります。 またIALL
ではNOT(
zero)
となります。 -
要素別組込関数
LEADZ
とTRAILZ
は整数型(どの種別でも良い)の引数I
の左側の0のビット数、及び右側の0のビット数を返します。 結果は基本整数型です。 -
要素別組込関数
MASKL
とMASKR
は左寄せもしくは右寄せされたビットマスクを生成します。MASKL(I,KIND)
の値は指定された種別の整数で、左側I
ビットが1に設定され、残りのビットは0に設定されます。I
は負ではない値で且つ結果のビットサイズ以下でなければなりません。KIND
が省略された場合、結果は基本整数型となります。MASKR
もほぼ同様ですが右側のI
ビットが1に指定されます。 -
[5.3.1]
要素別処理組込関数
MERGE_BITS(I,J,MASK)
は整数値I
とJ
を合併しますが、 この際に対応するMASK
のビットが1
の場合にはI
のビットを、 そしてゼロの場合にはJ
のビットを用いてそれを行います。 全ての引数は非10進定数表現もしくはInteger型でなければなりません。 また全てのInteger型の引数は同じ種別でなければなりません。 最低限、I
とJ
のどちらかがInteger型でなければならず、結果はこれと同じ種別と型になります。MERGE_BITS(I,J,MASK)
はIOR(IAND(I,MASK),IAND(J,NOT(MASK)))
と同等です。例えば
MERGE_BITS(INT(B'00110011',1),B'11110000',B'10101010')
はINT(B'01110010')
(10進値は114)と同じです。 -
配列集計組込関数
PARITY
は論理配列を集計します。 この関数はALL
及びANY
と同じような振る舞いをしますが.AND.
もしくは.OR.
演算を行う代わりに.NEQV.
演算で集計を行います。 つまり集計要素の.TRUE.
の数が奇数であった場合その結果は.TRUE.
となります。 -
要素別組込関数
POPCNT(I)
は整数引数I
で1に設定されているビット数を返します。 要素別組込関数POPPAR(I)
はI
で1に設定されたビットの数が奇数の場合1をそうでない場合は0を返します。 結果は基本整数型です。
10.6.3 その他の新たな組込手続 [5.3.1]
-
組込サブルーチン
EXECUTE_COMMAND_LINE
はコマンドラインをOSのコマンドプロセッサに渡し実行させます。 このサブルーチンは以下に示す順番の通りの5つの引数を持ちます。
CHARACTER(*),INTENT(IN) :: COMMAND
(実行されるコマンド)
LOGICAL,INTENT(IN),OPTIONAL :: WAIT
(コマンドの実行終了を待つかどうか。デフォルトはtrue)
INTEGER,INTENT(INOUT),OPTIONAL :: EXITSTAT
(コマンドの結果値)
INTEGER,INTENT(OUT),OPTIONAL :: CMDSTAT
(以下参照)
CHARACTER(*),INTENT(INOUT),OPTIONAL :: CMDMSG
(CMDSTAT
がゼロ以外の場合、エラーメッセージ)CMDSTAT
は正常終了の場合にゼロとなり、コマンドライン実行がサポートされていない場合は −1 となり、WAIT
が指定されていて且つfalseであるにも関わらず非同期実行がサポートされていない場合は −2 となります。 その他のエラーが発生した場合には正の値となります。CMDSTAT
が存在しない場合でゼロ以外が返されるであろう状況が生じた場合にはプログラムが停止します。 リリース 5.3.1においては全てのシステムでコマンドライン実行がサポートされていますが、非同期実行はどのシステムでもサポートされていません。例えば
CALL EXECUTE_COMMAND_LINE('echo Hello')
はおそらく ‘Hello
’ をコンソールウィンドウに表示します。 -
組込関数
STORAGE_SIZE(A,KIND)
はA
と同じ動的型と型パラメタを持つスカラ実体が配列要素として格納された場合の(パディングを含む)大きさをビット単位で返します。KIND
引数は省略可能です。 結果はInteger型で種別はKIND
もしくはKIND
が省略された場合には基本種別となります。A
が割付もしくはポインタの場合には、 遅延型パラメタ(例:CHARACTER(:)
)を持つ場合もしくはCLASS(*)
である場合を除き、 割付する必要はありません。 また多相ポインタである場合には未定義状態でなければなりません。例えば
STORAGE_SIZE(13_1)
は8(ビット)となります。 -
[6.0] 組込問合せ関数
IS_CONTIGUOUS
は一つの引数ARRAY
を持ちます。 この引数はどのような型の配列でも指定可能です。この関数はARRAY
が連続的に格納されている場合には真を返し、そうでない場合には偽を返します。 この関数に成分を持たない配列もしくは配列式を指定する事に意味がありません。 -
[7.0] 組込み関数
FINDLOC
はMAXLOC
およびMINLOC
と似ていますが、配列の最大値または最小値の位置を見つける代わりに、指定された値の位置を見つけます。 したがって、COMPLEX
やLOGICAL
を含むすべての組込み型で利用できます。 形式は以下の2つのいずれかとなります。FINDLOC (ARRAY, VALUE, DIM, MASK, KIND, BACK ) FINDLOC (ARRAY, VALUE, MASK, KIND, BACK )
whereARRAY
組込み型の配列で、次元数はN VALUE
同じ型のスカラー( LOGICAL
の場合)、または組込み演算子==
で比較可能(または .EQ.
)を使用してARRAY
と比較可能DIM
1からNの範囲のスカラー INTEGER
MASK
(省略可能) ARRAY
と同じ形状のLOGICAL
型の配列KIND
(省略可能) 有効な整数の種別番号を示すスカラー INTEGER
定数式BACK
(省略可能) LOGICAL
スカラー値関数の結果は
INTEGER
型、またはKIND
が存在する場合はINTEGER(KIND)
となります。DIM
のない形式では、結果は長さNのベクトルであり、ARRAY
内のVALUE
と等しい要素の位置です。MASK
が存在する場合、MASK
の対応する要素が.TRUE.
である要素のみが対象となります。MAXLOC
およびMINLOC
と同様に、位置は各次元の最初の要素を1とした場合の値で報告されます。VALUE
に等しい要素が見つからない場合、結果はゼロになります。BACK
が存在し且つその値が.TRUE.
の場合、見つかった要素は最も後ろの要素です(配列要素順序で)。それ以外の場合は最も前のものとなります。DIM
のある形式では、結果の次元数はN−1(ARRAY
がベクトルの場合はスカラー)です。 そしてその形状はARRAY
から次元DIM
が削除されたものとなります。 結果の各要素は、VALUE
と等しい次元DIM
ベクトル内の(マスクされた)要素の位置を示します。たとえば、
ARRAY
が値[10,20,30,40,50]
の整数ベクトルの場合、FINDLOC(ARRAY,30)
はベクトル[3]
およびFINDLOC(ARRAY,7)
は、ベクトル[0]
を返します。
10.6.4 既存の組込手続の変更 [大部分 5.3.1]
-
組込関数
ACOS
,ASIN
,ATAN
,COSH
,SINH
,TAN
,TANH
が新たに複素数型を受け入れるようになりました。 双曲線版と非双曲線版のこれらの関数と新たに追加されたACOSH
,ASINH
,ATANH
は単純な代数上の関連があります。 例えば新しいCOSH(X)
は古いCOS((0,1)*X)
と同一であり、 新しいSINH(X)
は古い(0,-1)*SIN((0,1)*X)
と同一です。 -
組込関数
ATAN
は新たにATAN2(Y,X)
と同じ意味でATAN(Y,X)
の形式が利用できるようになりました。 -
[6.2]
組込み関数
MAXVAL
及びMINLOC
で、KIND
引数に続く省略可能な引数BACK
が使えるようになりました。 論理型のスカラで、もし存在し、その値が.True.
の場合で、 2つ以上の成分が最大値(MAXVAL
)もしくは最小値(MINLOC
)の場合、 その値を持つ(最初ではなく)最後の成分の配列成分インデックスが返されます。例えば以下の値
MAXLOC( [ 5,1,5 ], BACK=.TRUE.)
は、[ 3 ]
の配列であり、[ 1 ]
ではありません。 -
組込関数
SELECTED_REAL_KIND
に第三番目の引数RADIX
が追加されました。 この引数で必要とされる実数種別の基数を指定します。 組込モジュールIEEE_ARITHMETIC
の関数IEEE_SELECTED_REAL_KIND
にもこの第三番目の引数が追加され、 今後IEEE十進浮動小数点種別が利用可能となった時点でこれを指定できるようになりました。
10.6.5
ISO_C_BINDING
の追加 [6.2]
標準組込みモジュールISO_C_BINDING
は以下の追加手続きを含みます。
INTERFACE c_sizeof PURE INTEGER(c_size_t) FUNCTION c_sizeof...(x) ! Specific name not visible TYPE(*) :: x(..) END FUNCTION END INTERFACE
実引数x
は相互運用可能でなければなりません。
結果はCのsizeof
演算子を概念的に対応するCエンティティに適用するのと同等です。
つまりx
の大きさをバイト数で表したものです。
x
が配列の場合、配列全体の大きさとなります。(単一成分の大きさではない)
x
は大きさ引き継ぎ配列であってはならない事に注意して下さい。
10.6.6
ISO_FORTRAN_ENV
の追加 [5.3]
組込モジュールISO_FORTRAN_ENV
に以下の追加の名前付き定数を含みます。
-
追加のスカラ整数定数
INT8
,INT16
,INT32
,INT64
,REAL32
,REAL64
,REAL128
。 これらは指定ビットサイズの整数と実数の種別型パラメータ値を提供します。 -
追加された
CHARACTER_KINDS
,INTEGER_KINDS
,LOGICAL_KINDS
,REAL_KINDS
。 これらは利用可能な種別型パラメータ値を列挙します。
[6.1]
標準組込みモジュールISO_FORTRAN_ENV
は新たに以下の2つの関数を含みます。
-
COMPILER_VERSION
. この関数は純粋で引数を持ちません。 結果としてソース・ファイルをコンパイルする際に用いられたコンパイラのバージョンを識別するスカラ基本文字列を返します。 この関数は変数や名前付き定数の初期化等を含む定数式で用いる事が可能です。 例)Module version_info Use Iso_Fortran_Env Character(Len(Compiler_Version())) :: compiler = Compiler_Version() End Module Program show_version_info Use version_info Print *,compiler End Program
nAG Fortran Compiler 6.1では以下の様な出力がなされます。nAG Fortran Compiler Release 6.1(Tozai) Build 6105
-
この関数は純粋で引数を持ちません。
結果としてソース・ファイルをコンパイルする際に指定したコンパイルオプションを識別するスカラ基本文字列を返します。
この関数は変数や名前付き定数の初期化等を含む定数式で用いる事が可能です。
例)
Module options_info Use Iso_Fortran_Env Character(Len(Compiler_Options())) :: compiler = Compiler_Options() End Module Program show_options_info Use options_info Print *,compiler End Program
コンパイルオプション-C=array -C=pointer -Oでコンパイルされた場合、 例えば以下の様な出力をします。-C=array -C=pointer -O