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)
答案 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
来将每个明确指定的低精度变量提升到更高的精度。