如何将数字的精度声明为可调参数?

use*_*772 1 precision gcc fortran gfortran arbitrary-precision

在2013年,有一个问题是将大工作代码从双精度转换为四倍精度:" 将工作代码从双精度转换为四倍精度:如何从输入文件读取FORTRAN中的四倍精度数字 ",以及共识是使用可调参数"WP"来声明变量,该参数指定"工作精度",而不是使用D + 01声明的变量的程序的单独版本,以及使用Q + 01的另一个版本.通过这种方式,我们可以通过在顶部定义WP = real128或WP = real64来轻松来回切换,其余的不需要更改.

但是我们怎么做呢?

我通过编写一个简单的代码TEST.F90在该问题的答案中尝试了这个建议:

  PROGRAM TEST
  use ISO_FORTRAN_ENV
  WP= real128
  IMPLICIT NONE
  real (WP) ::  X
  X= 5.4857990945E-4_WP
  END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)

编译:

~/gcc-4.6/bin/gfortran -o tst.x TEST.F90
Run Code Online (Sandbox Code Playgroud)

但它给出了:

      IMPLICIT NONE
                   1
Error: Unexpected IMPLICIT NONE statement at (1)
QLEVEL16.F90:5.12:

      real (WP) ::  MEL 
            1
Error: Parameter 'wp' at (1) has not been declared or is a variable, which does not reduce to a constant expression
QLEVEL16.F90:6.29:

      MEL= 5.4857990945E-4_WP
                             1
Error: Missing kind-parameter at (1)
Run Code Online (Sandbox Code Playgroud)

Ale*_*ogt 5

类型说明符必须是整数参数 - 并且您没有适当地声明它.此外,implicit none必须在任何声明之前.

这是一个解决这两个问题的工作版本:

PROGRAM TEST
  use ISO_FORTRAN_ENV
  IMPLICIT NONE
  integer, parameter :: WP= real128
  real (WP) ::  X

  X= 5.4857990945E-4_WP
END PROGRAM TEST
Run Code Online (Sandbox Code Playgroud)

  • 使用`intrinsic,intrinsic :: iso_fortran_env,wp => real128`可能更有吸引力,不是吗? (3认同)