2011-03-10 29 views
3

私はFortranで書かれた非線形偏微分方程式のシステムを設定し、それを繰り返し解く非常に大きなコードを持っています。すべての変数を倍精度にする必要があります。私がコードのために書いた追加のモジュールでは、すべての変数を倍精度型として宣言しますが、私のモジュールでは、実際の型として宣言されている古いソースコードの変数が使用されています。ですから、私の質問は、単精度変数にfortranの倍精度変数を乗算するとどうなりますか?値の格納に使用された変数が倍精度として宣言されている場合、結果は倍精度ですか?そして、倍精度の値に最後に "D0"のない定数を掛けた場合はどうでしょうか?すべての実数/倍精度/定数を倍精度にするために、Intel 11.1でコンパイラオプションを設定するだけでよいですか?intel 11.1コンパイラを使用してFortran 90の倍精度を取得する

答えて

3

Fortran標準は非常に具体的です。他の言語もこれに似ていて、あなたが期待するものです。式に異なる精度の2つの浮動小数点変数に対する演算が含まれている場合、式はより高精度のオペランドの型になります。例えば、

(実変数)+(ダブル変数) - >(ダブル)

(ダブル変数)*(実変数) - >(ダブル)

(ダブル変数)*(実定数) - >(ダブル)

など今

あなたは低精度の浮動小数点変数に結果を格納している場合、それは再びダウンコンバートますよ。しかし、それをより高い精度の変数に格納している場合は、その精度を維持します。

あなたは単精度浮動小数点変数が問題を引き起こしていることを懸念しているいずれかの例がある場合、あなたは(DBLEを使用して倍精度に を変換することを強制することができます)固有:

DBLE(実際の変数) - > double

1

Jonathan Dursi's answerが正しい - 実際の変数をすべて倍精度にする方法があれば、あなたの質問の他の部分は正しいです。

-i8(整数用)と-r8(実用用)オプションを使用して、ifortコンパイラでこれを実行できます。コンパイラがリテラルを倍精度として解釈するように強制する方法があるかどうかはわかりません(3.14159265359を3.14159265359D0に変更するなど)。

4

私の質問は、単精度変数にfortranの倍精度変数を乗算するとどうなりますか?単精度は倍精度に変換され、演算は倍精度で行われます。

値の格納に使用された変数が倍精度として宣言されている場合、結果の倍精度が得られますか?必ずしもそうではありません。右側は、変数が格納される左側の変数の精度について「認識」していない式です。 Double = SingleA * SingleB(型を示す名前を使用)がある場合、計算は単精度で実行され、次に格納のためにdoubleに変換されます。これは計算のための余分な精度を得ることはありません!

最後に "D0"を含まない定数で倍精度の値を掛けた場合はどうなりますか?これは最初の質問と同じですが、定数は倍精度に昇格され、計算は倍精度で行われます。 でも定数は単精度であり、倍精度定数のように多くの桁数を書き留めた場合でも、内部記憶域は単精度であり、その精度を表すことはできません。たとえば、DoubleVar * 3.14159265359は倍精度で計算されますが、倍精度で行われるDoubleVar * 3.14159に近い値になります。

コンパイラに定数の桁数を多く保持させたい場合は、定数の精度を指定する必要があります。

integer, parameter :: DoubleReal_K = selected_real_kind (14) 
real (DoubleReal_K) :: A 
A = 5.0_DoubleReal_K 
A = A * 3.14159265359_DoubleReal_K 
2

フォーム0.1D0内の数値を記述する場合、それは扱います。これを行うには、Fortran 90の方法は、何が必要な精度で、あなた自身の本当のタイプ、例えばを定義するために、少なくとも14桁を要求することですこれは倍精度の数値として、そうでなければ0.1を書いた場合、精度は変換で失われます。ここで は一例です:

program main 
implicit none 
real(8) a,b,c 
a=0.2D0 
b=0.2 
c=0.1*a 
print *,a,b,c 
end program 

ifort main.f90 

でコンパイルしたとき、私は結果を得る:

ifort -r8 main.f90 

でコンパイルしたとき、私は結果を得る

0.200000000000000  0.200000002980232  2.000000029802322E-002 

を:

0.200000000000000  0.200000000000000  2.000000000000000E-002 

あなたはIBM XLFコンパイラーを使用する場合は、同値が

xlf -qautodbl=dbl4 main.f90 
です
関連する問題