当前位置: 首页 > 文档资料 > Fortran 中文教程 >

数字精度( Numeric Precision)

优质
小牛编辑
137浏览
2023-12-01

我们已经讨论过,在早期版本的Fortran中,有两种real类型:默认的真实类型和double precision类型。

但是,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更多的存储位数。 虽然这取决于机器。

例子 (Example)

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)内部函数返回指数的小数范围。

例子 (Example)

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。

例子 (Example)

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