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及びMINVALで、
KIND引数に続く省略可能な引数BACKが使えるようになりました。
論理型のスカラで、もし存在し、その値が.True.の場合で、
2つ以上の成分が最大値(MAXVAL)もしくは最小値(MINVAL)の場合、
その値を持つ(最初ではなく)最後の成分の配列成分インデックスが返されます。
例えば以下の値
MAXVAL( [ 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