浮点数的精度

real 类型的浮点数不能有任何实际值。它们可以表示一定数量的十进制数字的实数。

FORTRAN 77 保证了两种浮点类型,更新的标准保证了至少两种实际类型。实变量可以声明为

real x
double precision y

x 这里是一个真实的默认类型,y 是一个比 x 更精确的小数精度。在 Fortran 2008 中,y 的小数精度至少为 10,小数指数范围至少为 37。

 real, parameter             :: single = 1.12345678901234567890
 double precision, parameter::double = 1.12345678901234567890d0
 
 print *, single
 print *, double

版画

   1.12345684    
   1.1234567890123457

在使用默认配置的常见编译器中。

请注意双精度常数中的 d0。包含 d 而不是 e 的真实文字用于表示指数用于表示双精度。

! Default single precision constant
1.23e45
! Double precision constant
1.23d45

Fortran 90 使用种类引入参数化 real 类型。真实类型的类型是一个名为常量或文字常量的整数:

real(kind=real_kind) :: x

要不就

real(real_kind) :: x

该声明声明 x 属于 real,具有一定的精度,具体取决于 real_kind 的值。

可以使用后缀使用特定类型声明浮点文字

1.23456e78_real_kind

real_kind 的确切值不是标准化的,并且不同于编译器。要查询任何实变量或常数的类型,可以使用函数 kind()

print *, kind(1.0), kind(1.d0)

通常会打印

4 8

要么

1 2

取决于编译器。

种类数量可以通过多种方式设置:

  1. 单(默认)和双精度:

    integer, parameter::single_kind = kind(1.)
    integer, parameter::double_kind = kind(1.d0)
    
  2. 使用内在函数 selected_real_kind([p, r]) 指定所需的小数精度。返回的种类具有至少 p 位的精度,并且允许指数至少为 r

    integer, parameter::single_kind = selected_real_kind( p=6, r=37 )
    integer, parameter::double_kind = selected_real_kind( p=15, r=200 )
    
  3. 从 Fortran 2003 开始,可以通过内部模块 ISO_C_Binding 获得预定义的常量,以确保实际类型可以与随附的 C 编译器的 floatdoublelong_double 类型互操作:

    use ISO_C_Binding
    
    integer, parameter::single_kind = c_float
    integer, parameter::double_kind = c_double
    integer, parameter::long_kind = c_long_double
    
  4. 从 Fortran 2008 开始,可以通过内部模块 ISO_Fortran_env 获得预定义的常量。这些常量提供具有特定存储大小的实数类型

    use ISO_Fortran_env
    
    integer, parameter::single_kind = real32
    integer, parameter::double_kind = real64
    integer, parameter::quadruple_kind = real128
    

如果编译器中没有某种类型,则 selected_real_kind() 返回的值或整数常量的值为 -1