Fortran 浮点数精度

示例

类型的浮点数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. 与2003年的Fortran开始,预先定义的常量都可以通过固有的模块ISO_C_Binding,以确保真正的品种是可互操作的同类型float,double或long_double伴随的C编译器:

    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。