2012-02-09 24 views
6

quadrupleを使用せずにdoubleの精度で16桁以上を取得できますか?可能であれば、コンパイラなどに依存しますか?誰かが彼がdoubleの精度で作業していて、22桁の精度を持っていたと知っていたからです。倍精度の拡張

答えて

6

データ型double precisionはFortran 77に由来し、その型の唯一の要件はrealよりも精度が高いことです。もう使用しないでください。

Fortran 90/95以降では、少なくとも2つの実数のサイズがサポートされています。精度は、kindパラメータによって決定され、その値はコンパイラによって異なります。あなたは

real(kind=long_double) :: a, b 
としてあなたの変数を宣言することができ、その後

integer, parameter :: long_double = SELECTED_REAL_KIND(22) 

を:

real(kind=8) :: a, b 

は精度を定義する移植可能な方法を持っているために、あなたが使用することによって、特定の精度を可能にkind値を得ることができます

しかし、あなたのコンパイラがその精度をサポートするかどうかはわかりません。その場合、SELECTED_REAL_KIND関数は負の数を返します。

は、最初の回答の状態としてもthis post

+0

しかし、あなたは '整数 'を書きました。 'integer'だけが' double 'ではなく22桁を持つことができますか? – Shibli

+0

'long_double'は整数であり、' real'変数 'a'と' b'の種別を少なくとも精度を持つように指定するために使用されます。22 – steabert

+2

@Shibli単精度および倍精度浮動小数点数は、ポータブルな方法でシステムに浮動小数点数を返しこのためには 'integer、parameter :: sp = kind(1.e0)'と 'integer、parameter :: dp = kind(1.d0)'を使用できます。次に、倍精度浮動小数点を 'real(kind = dp):: double'として宣言できます。 – Chris

5

を参照して、最もポータブルな方法は、数の精度を指定することで本来の機能を使用することです。言語の設計コンセプトは、計算に必要な精度を求めて要求し、コンパイラがその精度以上を提供することです。たとえば、微分方程式の解が小数点以下11桁で安定していると計算すると、この値を要求するとコンパイラは要件を満たす最適な型を提供します。これは、ほとんどのプログラマにとっては外国のアプローチであり、ハードウェアが必要とするものよりもハードウェアによって提供されるものが何であるかを考えるのに慣れており、数値アナリストはほとんどいないので、あまり簡単ではないかもしれません。

特定のコンパイラとハードウェアにSELECTED_REAL_KIND組み込み関数を最適化して最適化したい場合は、実験を行いたい場合があります。いくつかの組み合わせはソフトウェアで四重極精度を提供しますが、これは遅くなります。倍精度と10バイトの拡張精度を持つコンパイラは、selected_real_kind(17)を使用してより長い型を提供します。倍精度と四倍精度で10バイトの拡張精度ではないコンパイラは、selected_real_kind(17)またはselected_real_kind(32)で四重極精度を提供します。 (私は、10バイトの拡張と四重極の両方をサポートするコンパイラは認識していません)。四重極精度のないコンパイラはselected_real_kind(32)に対して-1を返します。