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と比較可能DIM1からNの範囲のスカラー INTEGERMASK(省略可能) 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 ProgramnAG 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
