2012-07-09 45 views
9

gfortranで4倍精度を使用しようとしていますが、real*16が機能しないようです。周りのいくつかの釣りの後、私はreal*10として実装されることがわかった。 real*10実際にクワッド精度ですか?gfortranで4倍精度を使用して検証する方法は?

コードの精度をどのようにテストできますか?精度をテストするための標準的な単純なアルゴリズムはありますか?たとえば、コンピュータのゼロが何であるか把握したいときは、0.0に達するまで2.0で割ります。値を記録しておくと、コンピュータがゼロ以外の数字がゼロであると思うときに私に知らせることができます。

私が記述したようなアルゴリズムのタイプで精度を計算する良い方法はありますか?

+0

残念ながら、私たちは情報が実際には何かを意味していない*「動作しません」*。このような処方は、有用なことは何も伝えていないので、良い質問で決して使用すべきではない。 –

答えて

11

既存の回答に追加する... real * Nは言語の拡張であり、使用されないことをお勧めします。実数* 10は4倍精度ではありません。 Isは「拡張」と呼ばれ、Intelプロセッサーによって提供される10バイトのタイプです。実際の* 16はコンパイラのバージョン、ハードウェア、libquadmathの可用性に応じて、gfortranで利用可能であるかもしれません。ソフトウェアで提供される場合、それは遅くなります。

希望する精度を要求するFortranの方法は、selected_real_kind関数を使用して、必要な精度の種類値を定義することです。

integer, parameter :: QR_K = selected_real_kind (32) 
real (kind=QR_K) :: MyReal 

利用可能な場合は、4倍の実数を取得します。また、Fortran 2008以降では、 "ISO_FORTRAN_ENV"を使用して、種類値REAL128にアクセスすることができます。精度が利用できない場合、種類値は-1になります。

関連質問:What does `real*8` mean?

+0

* "real * 10は4倍精度ではありませんが、"拡張 "と呼ばれています - これはIntelプロセッサが提供する10バイトのタイプです" * Motorola 68kチップでも利用可能です。 – dmckee

+0

それはですか? (kind = QR_K):: MyReal real(kind = QR_K):: MyReal? – user1271772

+0

はい、タイプミスです。それは 'real'でなく' read'でなければなりません。回答が修正されました。 –

2

kind type parameters回答を読み込む特に最後の文で、この質問、のためのgfortranドキュメント:

利用できる種類のパラメータ

が に一定の配列 CHARACTER_KINDS、INTEGER_KINDS、LOGICAL_KINDSとREAL_KINDSで見つけることができますISO_FORTRAN_ENVモジュール(ISO_FORTRAN_ENVを参照)。

あなたの発見したことは、real*16がご使用のプラットフォームに実装されていないことです。あなたはその後、親切な変数を取得するためにiso_c_bindingモジュールからselected_real_kind()またはiso_fortran_envモジュールまたはc_long_double種類の値を使用することができます近代的なFortranコードのための

6

使用種類、すなわち

real(some_kind_value) :: variable 

。これらはすべてわずかに異なる意味を持っています。

コードの実際の精度を評価するには、epsilon(),tiny()huge()またはnearest()の組み込み関数を使用できます。

gfortranのクォード精度には、通常、ほとんどのプラットフォームで使用できるようにする必要がありますが、デフォルトではないlibquadmathライブラリが必要です。

1

実(種類= 10)は、いわゆる拡張80ビットの精度Wikipedia 80-bitあります。

実数(種別= 16)は、適切な4倍128ビットの前提Wikipedia 128-bitです。

すでに述べたように、selected_real_kind()、epsilon()、tiny()、huge()を使用して、使用する精度を選択してチェックできます。

+3

注意:種類パラメータに特定の数値を使用することは、コンパイラ間で移植できません。 –

0

は(私のプラットフォームで

テストファイル上のTEST.EXE

-oのgfortran -fdefault-実8 test.f

 implicit double precision(a-h,o-z) 
1 continue 
     print * , ' i:' 
     read(5,*) i 
     if(i.le.0) stop 
     a=i 
     b=sqrt(a) 
     print * , b 
     c=b*b 
     print * , c 
     goto 1 
     end 

のgfortranコマンドを試してみてくださいFEDORA 20)それは動作します。

+4

これは本当にひどいです。すべての倍精度変数を4倍精度として持つ副作用は非常に面倒です。私は 'real * 16 'がうまくいかなければ、実際にクワッドを倍増させるわけではないので、元の問題を解決することはできません。 –