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