如何将数字的精度声明为可调参数?
How do I declare the precision of a number to be an adjustable parameter?
2013 年有一个关于将大型工作代码从双精度转换为四精度的问题:“Converting a working code from double-precision to quadruple-precision: How to read quadruple-precision numbers in FORTRAN from an input file”,共识是使用可调整的参数 "WP" 来声明变量,该参数指定"working precision",而不是使用 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)
种类说明符必须是整数参数 - 您没有正确声明它。此外,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
其实很多代码都是用这个WP的方式。许多具有 select_*_kind 内在功能。但是我认为有一个 'easier' 方法。它是使用默认精度而不指定任何类型关键字并使用编译器的标志来选择默认精度。
Pro 如果您不需要精确控制每个变量的精度,这种方法是否更容易。 Con 是这将在很大程度上取决于编译器标志,每个编译器都有所不同,甚至可能不可用。
对于 gfortran,有更多的标志 -freal4-real8
或 -freal4-real16
来将每个明确指定的较低精度变量提升为较高精度。
2013 年有一个关于将大型工作代码从双精度转换为四精度的问题:“Converting a working code from double-precision to quadruple-precision: How to read quadruple-precision numbers in FORTRAN from an input file”,共识是使用可调整的参数 "WP" 来声明变量,该参数指定"working precision",而不是使用 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)
种类说明符必须是整数参数 - 您没有正确声明它。此外,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
其实很多代码都是用这个WP的方式。许多具有 select_*_kind 内在功能。但是我认为有一个 'easier' 方法。它是使用默认精度而不指定任何类型关键字并使用编译器的标志来选择默认精度。
Pro 如果您不需要精确控制每个变量的精度,这种方法是否更容易。 Con 是这将在很大程度上取决于编译器标志,每个编译器都有所不同,甚至可能不可用。
对于 gfortran,有更多的标志 -freal4-real8
或 -freal4-real16
来将每个明确指定的较低精度变量提升为较高精度。