Fortran-numeric-precision

提供:Dev Guides
移動先:案内検索

Fortran-数値精度

Fortranの古いバージョンでは、デフォルトの実数型と*倍精度*型の2つの*実数*型があることをすでに説明しました。

ただし、Fortran 90/95では、 kind 指定により、実データ型および整数データ型の精度をより詳細に制御できます。

種類の属性

異なる種類の番号は、コンピューター内で異なる方法で保存されます。 kind 属性を使用すると、数値を内部的に保存する方法を指定できます。 例えば、

real, kind = 2 :: a, b, c
real, kind = 4 :: e, f, g
integer, kind = 2 :: i, j, k
integer, kind = 3 :: l, m, n

上記の宣言では、実変数e、f、およびgは、実変数a、b、およびcよりも精度が高くなっています。 整数変数l、m、およびnは、整数変数i、j、およびkよりも大きな値を格納でき、格納する桁数が多くなります。 これはマシンに依存しますが。

program kindSpecifier
implicit none

   real(kind = 4) :: a, b, c
   real(kind = 8) :: e, f, g
   integer(kind = 2) :: i, j, k
   integer(kind = 4) :: l, m, n
   integer :: kind_a, kind_i, kind_e, kind_l

   kind_a = kind(a)
   kind_i = kind(i)
   kind_e = kind(e)
   kind_l = kind(l)

   print *,'default kind for real is', kind_a
   print *,'default kind for int is', kind_i
   print *,'extended kind for real is', kind_e
   print *,'default kind for int is', kind_l

end program kindSpecifier

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

default kind for real is 4
default kind for int is 2
extended kind for real is 8
default kind for int is 4

変数のサイズを問い合わせる

数値のサイズを調べることができる組み込み関数がいくつかあります。

たとえば、* bit_size(i)組み込み関数は、ストレージに使用されるビット数を指定します。 実数の場合、 precision(x)組み込み関数は精度の10進数の桁数を返し、 range(x)*組み込み関数は指数の10進数の範囲を返します。

program getSize
implicit none

   real (kind = 4) :: a
   real (kind = 8) :: b
   integer (kind = 2) :: i
   integer (kind = 4) :: j

   print *,'precision of real(4) =', precision(a)
   print *,'precision of real(8) =', precision(b)

   print *,'range of real(4) =', range(a)
   print *,'range of real(8) =', range(b)


   print *,'maximum exponent of real(4) =' , maxexponent(a)
   print *,'maximum exponent of real(8) =' , maxexponent(b)

   print *,'minimum exponent of real(4) =' , minexponent(a)
   print *,'minimum exponent of real(8) =' , minexponent(b)

   print *,'bits in integer(2) =' , bit_size(i)
   print *,'bits in integer(4) =' , bit_size(j)

end program getSize

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

precision of real(4) = 6
precision of real(8) = 15
range of real(4) = 37
range of real(8) = 307
maximum exponent of real(4) = 128
maximum exponent of real(8) = 1024
minimum exponent of real(4) = -125
minimum exponent of real(8) = -1021
bits in integer(2) = 16
bits in integer(4) = 32

種類の値を取得する

Fortranは、整数と実数の必要な精度の種類の値を取得するために、さらに2つの組み込み関数を提供します-

  • selected_int_kind(r) *selected_real_kind([p、r])

selected_real_kind関数は、指定された10進精度pおよび10進指数範囲rに必要なkind型パラメーター値である整数を返します。 10進数の精度は有効桁数であり、10進数の指数範囲は表現可能な最小および最大の数値を指定します。 したがって、範囲は10-r〜10 + rです。

たとえば、selected_real_kind(p = 10、r = 99)は、小数点以下10桁の精度と少なくとも10-99から10 + 99の範囲に必要な種類の値を返します。

program getKind
implicit none

   integer:: i
   i = selected_real_kind (p = 10, r = 99)
   print* ,'selected_real_kind (p = 10, r = 99)', i

end program getKind

上記のプログラムをコンパイルして実行すると、次の結果が生成されます-

selected_real_kind (p = 10, r = 99) 8