11

gfortran で 4 倍精度を使用しようとしていますが、real*16うまくいかないようです。いくつかの釣りの後、それが として実装される可能性があることがわかりましたreal*10real*10 実際には4倍精度ですか?

コードの精度をテストするにはどうすればよいですか? 精度をテストするための標準的な単純なアルゴリズムはありますか? たとえば、コンピューターのゼロが何であるかを知りたい場合、0.0 になるまで 2.0 で割り続けます。値を追跡することで、コンピューターがゼロ以外の数値がゼロであると「考える」ときを知ることができます。つまり、コンピューターがゼロになります。

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

4

5 に答える 5

13

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

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

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

利用可能な場合、クワッド実数を取得します。または、Fortran 2008 以降では、「ISO_FORTRAN_ENV を使用」してから、kind 値 REAL128 にアクセスできます。精度が利用できない場合、種類の値は -1 になります。

関連する質問: 「real*8」 とはどういう意味ですか?

于 2012-07-09T17:47:59.057 に答える
7

最新のFortranコードには種類を使用します。

real(some_kind_value) :: variable

次に、selected_real_kind()またはiso_fortran_envmoduleまたはmoduleのc_long_doublekind値を使用iso_c_bindingして、kind変数を取得できます。これらはすべて、わずかに異なる意味を持っています。

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

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

于 2012-07-09T17:11:18.960 に答える
2

種類の型パラメーターに関する gfortran のドキュメントは、この質問、特に最後の文に答えています。

利用可能な kind パラメータは、ISO_FORTRAN_ENV モジュールの定数配列 CHARACTER_KINDS、INTEGER_KINDS、LOGICAL_KINDS、および REAL_KINDS にあります (ISO_FORTRAN_ENV を参照)。

あなたが発見したかもしれないことは、それreal*16があなたのプラットフォームに実装されていないということです.

于 2012-07-09T16:31:41.473 に答える
1

real(kind=10) は、いわゆる拡張 80 ビット精度Wikipedia 80-bitです。

real(kind=16) は、適切な 4 倍の 128 ビット精度Wikipedia 128-bitです。

すでに述べたように、selected_real_kind()、epsilon()、tiny()、huge() を使用して、使用する精度を選択および確認できます。

于 2012-07-09T17:48:12.597 に答える