2009-05-08 8 views
25

Fortran 90のkindパラメータの理解に問題があります。私が知る限り、変数の精度(すなわち、浮動小数点または二重)は決定されず、変数の型も決定されません。Fortran 90種類のパラメータ

それでは、それは何を決定し、それは正確に何ですか?

+0

Kind notationを参照していますか? – TStamper

答えて

3

ポートランドグループFortranリファレンスから、KINDパラメータは「組み込みデータ型の精度を指定します。」したがって、宣言で

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

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

これは、実行しているコンパイラとマシンとは無関係に、変数の精度を修正できるので便利です。伝統的なIEEE単精度実数(数値解析クラスを使用している場合は非常に可能です)より精度が高い計算を実行していて、変数をreal :: myVarと宣言すると、コンパイラはすべてrealの値を倍精度にデフォルト設定しますが、コンパイラオプションを変更するか、異なるデフォルトサイズ(realinteger)の異なるマシンにコードを移動すると、厄介な驚きが発生しますアップ)。 SELECTED_INT_KINDSELECTED_REAL_KIND - -

Fortranはまた、あなたが必要なものであることをKINDパラメータを選ぶのに役立ちますいくつかの機能が含まれていますが、単に学習している場合、私はこの時点で、これらの心配はないでしょう。

クラスの一部としてFortranを学習していると述べたので、Fortran resourcesにもこの質問があります。使用しているコンパイラスイート(例:Portland GroupまたはIntel)のリファレンスマニュアルを見てください。これらは通常自由に利用できます。

+0

いいえ、これは移植性がありません。初心者にはお勧めしないでください。 –

44

変数の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_KINDSELECTED_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を検索すると、コンパイラで利用できる種類について説明する便利なプログラムが得られます。

+4

KINDが*ではないことを指摘してくれてありがとうございます* KIND = <必要なバイト数> - これは現代のコンパイラを見たことがありますか?そのkindfinder.f90プログラムはとてもクールです。 –

+3

usenetの検索結果が表示されます。salford f95コンパイラは、1,2、および3を使用して2〜4および8バイトの変数を表します。私はg95がg95とgfortranが来る前にg77が同じことをしたという主張を見た。 NAG fortranコンパイラが(1,2,3,4)体系と(1,2,4,8)体系の間の選択を可能にするコンパイラスイッチを持っていたという報告がある。間違いなく他の人がいる。 はい、kindfinderは便利です。実際のプログラムに移植性のないマジックナンバーが詰まっていないように、さまざまな種類の名前付きパラメータを含むサイト固有のモジュールファイルを設定することができます。 –

+4

実際にタイプをストレージのバイト数で指定したい場合、Fortran 2003にはCタイプに対応する種類の値を提供するISO_C_Bindingがあります。その中にはストレージサイズを指定するものがあります。 Fortran 2008は、ISO_FORTRAN_ENVモジュールに、32ビットの 'real32'種類の値、64ビットの' real64'などの型を提供します。これらはFortran 2003または2008を持っている限り移植可能という利点がありますコンパイラ。これらの2つのモジュールの種類のリストについては、gfortranのマニュアルを参照してください。 –

4

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

+0

'int8'は(適切な種類が利用可能な場合)種別パラメータを指定します。私はあなたが 'int(kind = 1)'のような明示的な数値にこれを好むべきだと思っていますか? [この後者は、関係なく悪い練習になるだろう。]おそらくあなたは明らかにすることができますか? – francescalus

+0

あなたのコメント@francescalus – Zeus

+0

@francescalusと同意します。この質問を標準的な質問にして、fortranのさまざまなバージョンのすべての話全体をまとめた単一の「コミュニティ回答」を持つことは有益でしょうか?私はしばしば、このような完全な標準的な答えを参照したいコードを参照します。ここは最高の場所ですが、情報はさまざまな回答やさまざまなコメントに完全に広がっています。 (申し訳ありませんが、これは私があなたに連絡するために見つけた最良の方法です) – kvantour