web-dev-qa-db-ja.com

Fortran 90種類パラメーター

Fortran 90のkindパラメーターの理解に問題があります。私が知る限り、変数の精度(つまり、floatまたはdouble)を決定することも、変数の型を決定することもありません。

それで、それは何を決定し、何のために正確にありますか?

33
Lana

変数のKINDは、サポートされている種類のどれを使用すべきかをコンパイラーに伝える整数ラベルです。

KINDパラメータがそのKINDの変数に格納されているバイト数と同じになるのはcommonですが、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

整数型および論理型についても同様です。

(掘りに行った場合、おそらく例を見つけることができます。usenetグループcomp.lang.fortranでkindを検索して例を見つけてください。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*4real*8などの宣言スタイルに戻すことができます。

新しいコンパイラーを開始するときは、コンパイラー固有の種類の値を調べる価値があるので、何を扱っているのかがわかります。 kindfinder.f90をネットで検索して、コンパイラで使用できる種類について説明する便利なプログラムを探してください。

50
Andrej Panjkov

Fortran 2008以降を使用することをお勧めします。 INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128。これを行うには、Fortran 2003以降でISO_FORTRAN_ENVを呼び出します。種類のパラメーターは、常に適切な数のビット表現を取得するための一貫性のない方法を提供します

7
Zeus

他の(非常に良い)答え、特に Andrej Panjkov の答えを展開するだけです:

変数のKINDは、サポートされている種類のどれを使用すべきかをコンパイラーに伝える整数ラベルです。

丁度。ただし、すべてのnumeric組み込みタイプでは、KINDパラメーターを使用して、表現と動作の「model」を指定しますプロセッサ上の数字の」(標準のセクション16.5からの単語)は、実際にはビットモデルを意味し、それがKINDパラメータが表す唯一のものではありません。

型のKINDパラメーターは、その性質、モデル、またはプログラマーがコンパイル時に選択できる動作のあらゆるバリエーションです。たとえば、組み込みの文字タイプの場合、kindパラメータはプロセッサで使用可能な文字セット(ASCII、UCS-4、...)を表します。

定義済みの派生型(Fortran 2003以降)で独自のモデル/動作のバリエーションを定義することもできます。トランスフォームマトリックスタイプを作成し、2D空間に対してKIND = 2(基礎となる配列が3x3になる)と3D空間に対してKIND = 3(4x4が基礎となる配列)のバージョンを持つことができます。非組み込み型には自動種類変換はないことを覚えておいてください。

2

Portland Group Fortran ReferenceKINDパラメーターは、「組み込みデータ型の精度を指定します」。したがって、宣言では

real(kind=4) :: float32
real(kind=8) :: float64

変数float64は、8バイトの実数として宣言されています(古いFortran DOUBLE PRECISION)および変数float32は4バイト実数(古いFortran REAL)として宣言されます。

これは、実行しているコンパイラやマシンに依存せずに変数の精度を修正できるため便利です。従来のIEEE単精度実数よりも高い精度を必要とする計算を実行している場合(数値解析クラスを使用している場合は非常に可能性が高い)、変数をreal :: myVar、コンパイラがすべてのreal値を倍精度にデフォルトに設定しても問題ありませんが、コンパイラオプションを変更するか、realおよびinteger変数は、おそらく厄介な驚きをもたらします(たとえば、反復行列ソルバーが爆発する)。

Fortranには、KINDパラメーターを選択して必要なものにするためのいくつかの関数も含まれています-SELECTED_INT_KINDおよびSELECTED_REAL_KIND-しかし、あなたが学習しているだけなら、私はこの時点でそれらについて心配しません。

クラスの一部としてFortranを学習していると述べたので、 Fortranリソース でこの質問を確認し、使用しているコンパイラスイートのリファレンスマニュアル(ポートランドグループなど)を参照してください。またはIntel)-これらは通常無料で入手できます。

1
Tim Whitcomb