Fortran 90 のkind
パラメータがわかりません。私の知る限り、変数の精度 (つまり、float か double) も、変数の型も決定しません。
それで、それは何を決定し、正確には何のためにあるのでしょうか?
Fortran 90 のkind
パラメータがわかりません。私の知る限り、変数の精度 (つまり、float か double) も、変数の型も決定しません。
それで、それは何を決定し、正確には何のためにあるのでしょうか?
変数の KIND は、サポートされているどの種類を使用する必要があるかをコンパイラに伝える整数ラベルです。
KIND パラメータがその KIND の変数に格納されているバイト数と同じであることは一般的ですが、Fortran 標準では必須ではないことに注意してください。
つまり、多くのシステムでは、
REAl(KIND=4) :: xs ! 4 byte ieee float
REAl(KIND=8) :: xd ! 8 byte ieee float
REAl(KIND=16) :: xq ! 16 byte ieee float
ただし、たとえば次のようなコンパイラがある場合があります。
REAL(KIND=1) :: XS ! 4 BYTE FLOAT
REAL(KIND=2) :: XD ! 8 BYTE FLOAT
REAL(KIND=3) :: XQ ! 16 BYTE FLOAT
整数型と論理型についても同様です。
(掘り下げれば、おそらく例を見つけることができます。例kind
を見つけるには、usenet グループ comp.lang.fortran を検索してください。Fortran に関する最も情報に基づいた議論がそこで行われ、経験豊富な人々が貢献しています。)
では、異なるプラットフォームで同じデータ表現を提供する特定の種類の値を当てにできない場合、どうしますか? それが組み込み関数SELECTED_REAL_KIND
とSELECTED_INT_KIND
の目的です。基本的に、表現できるようにする必要がある数値の種類を関数に伝えると、使用する必要がある種類の数値が返されます。
私は通常、これらの種類を使用します。通常、4 バイトと 8 バイトの実数が得られるからです。
!--! specific precisions, usually same as real and double precision
integer, parameter :: r6 = selected_real_kind(6)
integer, parameter :: r15 = selected_real_kind(15)
したがって、後で変数を次のように宣言できます。
real(kind=r15) :: xd
これにより、混合言語プログラムを使用する場合に問題が発生する可能性があり、変数が占有するバイト数を絶対的に指定する必要があることに注意してください。確認する必要がある場合は、変数のメモリ フットプリント、その精度、指数範囲などを推測できる、それぞれの種類について通知する照会組み込み関数があります。または、非標準だがありふれreal*4
たreal*8
などの宣言スタイルに戻すこともできます。
新しいコンパイラを使い始めるときは、何を扱っているかを理解できるように、コンパイラ固有の種類の値を調べる価値があります。kindfinder.f90
コンパイラで利用できる種類について教えてくれる便利なプログラムをネットで検索してください。
Portland Group Fortranリファレンスから、KIND
パラメーターは「組み込みデータ型の精度を指定します」。したがって、宣言では
real(kind=4) :: float32
real(kind=8) :: float64
変数float64
は8バイトの実数(古いFortran DOUBLE PRECISION
)として宣言され、変数float32
は4バイトの実数(古いFortran REAL
)として宣言されます。
これは、実行しているコンパイラやマシンに関係なく、変数の精度を修正できるので便利です。従来のIEEE-単精度実数(数値解析クラスを使用している場合は非常に可能性が高い)よりも高い精度を必要とする計算を実行しているが、変数をとして宣言してreal :: myVar
いる場合は、コンパイラはすべてのreal
値を倍精度にデフォルト設定するように設定されていますが、コンパイラオプションを変更したり、変数のデフォルトサイズreal
とinteger
変数が異なる別のマシンにコードを移動したりすると、厄介な驚きが生じる可能性があります(たとえば、反復行列ソルバーが爆発します)。
KIND
Fortranには、必要なパラメーターを選択するのに役立ついくつかの関数も含まれています。ただし、学習しているだけの場合は、現時点ではそれらについて心配する必要はありません SELECTED_INT_KIND
。SELECTED_REAL_KIND
クラスの一部としてFortranを学習しているとおっしゃっていたので、 Fortranリソースについてもこの質問を確認し、使用しているコンパイラスイート(Portland GroupやIntelなど)のリファレンスマニュアルを参照してください。これらは通常、自由に利用できます。