Fortran 数字精度
我们已经讨论过,在旧版本的 Fortran 中,有两种实数类型:默认实数类型和双精度类型。
然而,Fortran 90/95 通过种类说明符对实数和整数数据类型的精度提供了更多的控制。
种类属性种类属性
不同类型的数字在计算机中的存储方式不同。kind 属性允许您指定如何在内部存储数字。例如,
real, kind = 2 :: a, b, creal, kind = 4 :: e, f, ginteger, kind = 2 :: i, j, kinteger, kind = 3 :: l, m, n
在上述声明中,实变量 e、f 和 g 比实变量 a、b 和 c 具有更高的精度。整数变量 l、m 和 n 可以存储比整数变量 i、j 和 k 更大的值,并且具有更多的存储位数。尽管这取决于机器。
实例
program kindSpecifierimplicit nonereal(kind = 4) :: a, b, creal(kind = 8) :: e, f, ginteger(kind = 2) :: i, j, kinteger(kind = 4) :: l, m, ninteger :: kind_a, kind_i, kind_e, kind_lkind_a = kind(a)kind_i = kind(i)kind_e = kind(e)kind_l = kind(l)print *,'default kind for real is', kind_aprint *,'default kind for int is', kind_iprint *,'extended kind for real is', kind_eprint *,'default kind for int is', kind_lend program kindSpecifier
结果为:
default kind for real is 4default kind for int is 2extended kind for real is 8default kind for int is 4
查询变量的大小
有许多内在函数允许您查询数字的大小。
例如,bit_size(i) 内在函数指定了用于存储的位数。对于实数,精度 (x) 内在函数返回精度的小数位数,而范围 (x) 固有函数返回指数的小数范围。
实例
program getSizeimplicit nonereal (kind = 4) :: areal (kind = 8) :: binteger (kind = 2) :: iinteger (kind = 4) :: jprint *,'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) = 6precision of real(8) = 15range of real(4) = 37range of real(8) = 307maximum exponent of real(4) = 128maximum exponent of real(8) = 1024minimum exponent of real(4) = -125minimum exponent of real(8) = -1021bits in integer(2) = 16bits 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 getKindimplicit noneinteger:: ii = selected_real_kind (p = 10, r = 99)print *,'selected_real_kind (p = 10, r = 99)', iend program getKind
结果为:
selected_real_kind (p = 10, r = 99) 8