我們已經討論過了,在舊版本的 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_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