Fortran 数字精度

我们已经讨论过,在旧版本的 Fortran 中,有两种实数类型:默认实数类型和双精度类型。

然而,Fortran 90/95 通过种类说明符对实数和整数数据类型的精度提供了更多的控制。

种类属性种类属性

不同类型的数字在计算机中的存储方式不同。kind 属性允许您指定如何在内部存储数字。例如,

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

在上述声明中,实变量 efg 比实变量 abc 具有更高的精度。整数变量 lmn 可以存储比整数变量 ijk 更大的值,并且具有更多的存储位数。尽管这取决于机器。

实例
  1. program kindSpecifier
  2. implicit none
  3. real(kind = 4) :: a, b, c
  4. real(kind = 8) :: e, f, g
  5. integer(kind = 2) :: i, j, k
  6. integer(kind = 4) :: l, m, n
  7. integer :: kind_a, kind_i, kind_e, kind_l
  8. kind_a = kind(a)
  9. kind_i = kind(i)
  10. kind_e = kind(e)
  11. kind_l = kind(l)
  12. print *,'default kind for real is', kind_a
  13. print *,'default kind for int is', kind_i
  14. print *,'extended kind for real is', kind_e
  15. print *,'default kind for int is', kind_l
  16. end program kindSpecifier

结果为:

  1. default kind for real is 4
  2. default kind for int is 2
  3. extended kind for real is 8
  4. default kind for int is 4

查询变量的大小

有许多内在函数允许您查询数字的大小。

例如,bit_size(i) 内在函数指定了用于存储的位数。对于实数,精度 (x) 内在函数返回精度的小数位数,而范围 (x) 固有函数返回指数的小数范围。

实例
  1. program getSize
  2. implicit none
  3. real (kind = 4) :: a
  4. real (kind = 8) :: b
  5. integer (kind = 2) :: i
  6. integer (kind = 4) :: j
  7. print *,'precision of real(4) =', precision(a)
  8. print *,'precision of real(8) =', precision(b)
  9. print *,'range of real(4) =', range(a)
  10. print *,'range of real(8) =', range(b)
  11. print *,'maximum exponent of real(4) =' , maxexponent(a)
  12. print *,'maximum exponent of real(8) =' , maxexponent(b)
  13. print *,'minimum exponent of real(4) =' , minexponent(a)
  14. print *,'minimum exponent of real(8) =' , minexponent(b)
  15. print *,'bits in integer(2) =' , bit_size(i)
  16. print *,'bits in integer(4) =' , bit_size(j)
  17. end program getSize

结果为:

  1. precision of real(4) = 6
  2. precision of real(8) = 15
  3. range of real(4) = 37
  4. range of real(8) = 307
  5. maximum exponent of real(4) = 128
  6. maximum exponent of real(8) = 1024
  7. minimum exponent of real(4) = -125
  8. minimum exponent of real(8) = -1021
  9. bits in integer(2) = 16
  10. bits in integer(4) = 32

获取种类值

Fortran 提供了另外两个内在函数来获得整数和实数所需精度的种类值:

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

selected_real_kind 函数返回一个整数,该整数是给定小数精度 p 和小数指数范围r所需的类型参数值。小数精度是有效位数,小数指数范围指定了最小和最大的可表示数字。因此,范围为 10-r10+r

例如,selected_real_kind(p=10,r=99) 返回精度为 10 位小数所需的种类值,范围至少为 10-9910+99

实例
  1. program getKind
  2. implicit none
  3. integer:: i
  4. i = selected_real_kind (p = 10, r = 99)
  5. print *,'selected_real_kind (p = 10, r = 99)', i
  6. end program getKind

结果为:

  1. selected_real_kind (p = 10, r = 99) 8

分类导航