私はFortranで書かれた非線形偏微分方程式のシステムを設定し、それを繰り返し解く非常に大きなコードを持っています。すべての変数を倍精度にする必要があります。私がコードのために書いた追加のモジュールでは、すべての変数を倍精度型として宣言しますが、私のモジュールでは、実際の型として宣言されている古いソースコードの変数が使用されています。ですから、私の質問は、単精度変数にfortranの倍精度変数を乗算するとどうなりますか?値の格納に使用された変数が倍精度として宣言されている場合、結果は倍精度ですか?そして、倍精度の値に最後に "D0"のない定数を掛けた場合はどうでしょうか?すべての実数/倍精度/定数を倍精度にするために、Intel 11.1でコンパイラオプションを設定するだけでよいですか?intel 11.1コンパイラを使用してFortran 90の倍精度を取得する
答えて
Fortran標準は非常に具体的です。他の言語もこれに似ていて、あなたが期待するものです。式に異なる精度の2つの浮動小数点変数に対する演算が含まれている場合、式はより高精度のオペランドの型になります。例えば、
(実変数)+(ダブル変数) - >(ダブル)
(ダブル変数)*(実変数) - >(ダブル)
(ダブル変数)*(実定数) - >(ダブル)
など今
あなたは低精度の浮動小数点変数に結果を格納している場合、それは再びダウンコンバートますよ。しかし、それをより高い精度の変数に格納している場合は、その精度を維持します。
あなたは単精度浮動小数点変数が問題を引き起こしていることを懸念しているいずれかの例がある場合、あなたは(DBLEを使用して倍精度に を変換することを強制することができます)固有:
DBLE(実際の変数) - > double
Jonathan Dursi's answerが正しい - 実際の変数をすべて倍精度にする方法があれば、あなたの質問の他の部分は正しいです。
-i8
(整数用)と-r8
(実用用)オプションを使用して、ifortコンパイラでこれを実行できます。コンパイラがリテラルを倍精度として解釈するように強制する方法があるかどうかはわかりません(3.14159265359を3.14159265359D0に変更するなど)。
私の質問は、単精度変数に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
フォーム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
です
- 1. intel Fortranコンパイラがトリプル精度で破砕されました
- 2. C++倍精度/精度
- 3. Fortranの単精度配列に倍精度を割り当てる
- 4. Fortran 2003ソースファイルの正しい接尾辞 - Intel Fortranコンパイラ
- 5. floatを使用して倍精度を実装しますか?
- 6. 3桁の精度で倍精度の値を四捨五入してエラーを取得する3
- 7. fscanfを使用してコンマ区切りの倍精度を読み取る
- 8. fscanfを使用してC言語の倍精度を読み取る方法
- 9. n番目の倍精度数値を取得するには
- 10. のstd ::関数<>とIntelコンパイラのバージョン11.1
- 11. 倍精度の拡張
- 12. ブースト::精神とIntelコンパイラのコンパイル・エラー
- 13. 倍精度
- 14. Javaの倍精度
- 15. 浮動小数点数を掛けて倍精度精度を維持する/取得する
- 16. 単精度への倍精度の丸め:上限の強制
- 17. C#の倍精度精度の損失、減算の倍数を加算するときの精度の低下
- 18. 4倍のCPU時間と倍精度
- 19. 倍精度を返す0
- 20. SSIS倍精度prob
- 21. PHPUnitテスト倍精度
- 22. 倍精度を追加する際の精度の低下
- 23. 精度で倍精度を出力する
- 24. 単精度、倍精度、および精度
- 25. Excel 2007 SDKを使用してxlTypeNumをC++で倍精度化する方法
- 26. 機能CORR(倍精度、倍精度)が存在しない - のPostgresSQL
- 27. Fortran 90のリソース?
- 28. gfortranで4倍精度を使用して検証する方法は?
- 29. Pointオブジェクトから倍精度の数値を取得する方法
- 30. QString :: toDouble()が誤った精度で倍精度を返す