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

时间:2016-07-16 21:15:05

标签: gcc fortran precision gfortran arbitrary-precision

2013年有一个关于将大工作代码从双精度转换为四倍精度的问题:" Converting a working code from double-precision to quadruple-precision: How to read quadruple-precision numbers in FORTRAN from an input file",并且共识是使用可调参数声明变量" 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

编译:

~/gcc-4.6/bin/gfortran -o tst.x TEST.F90

但它给出了:

      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)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

实际上很多代码都使用这种WP方法。许多具有select _ * _类型的内在函数。但我认为有一个更容易的'办法。使用默认精度而不指定任何kind关键字并使用编译器的标志来选择默认精度是什么。

Pro如果您不需要对每个变量进行精确的精度控制,这种方法就更容易了。 Con很大程度上取决于编译器标志,编译器标志因每个编译器而异,甚至可能不可用。

对于gfortran,有更多标志-freal4-real8-freal4-real16来将每个明确指定的低精度变量提升到更高的精度。