位置:首頁 > 高級語言 > Fortran教學 > Fortran數字精度

Fortran數字精度

我們已經討論過了,在舊版本的 Fortran,有兩個實型類型:默認的實型和雙精度型。

然而,Fortran語言90/95提供了更多通過種指定精度控製實數和整數數據類型。

類型屬性

不同類型的數字都在計算機內部存儲方式不同。 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)內部函數,返回小數位精度的數字,而range(x)內部函數返回指數的十進製範圍。

例子

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語言提供了兩個內部函數來獲得類型值整數和實數的精度:

  • selected_int_kind (r)
  • selected_real_kind ([p, r])

selected_real_kind函數返回一個整數,一個給定的小數精度p 和十進製指數範圍r 的類型的參數值。小數精度是明顯的位數,而小數指數範圍規定的最小和最大可表示數。因此該範圍是從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