【问题标题】:How do I declare the precision of a number to be an adjustable parameter?如何将数字的精度声明为可调参数?
【发布时间】:2016-11-19 19:41:33
【问题描述】:

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)

【问题讨论】:

    标签: gcc fortran precision gfortran arbitrary-precision


    【解决方案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
    

    【讨论】:

    • 太棒了!另一个线程中的答案似乎在使用 ISO_FORTRAN_ENV 之后应该是 WP=real128,并且没有显示“整数,参数 ::”部分。那是我问题的根源。谢谢!
    • use, intrinsic :: iso_fortran_env, wp=>real128 可能更诱人,不是吗?
    • 谢谢@francescalus。两种备选方案的优缺点是什么?
    • @user1271772,公平地说,它们的影响大致相同。我建议的版本可能更接近您在问题中的意图(即,使用的一部分)。它本质上是说“从模块中获取值real128,但在这里调用它wp”。另一个是“有一个新常量wp,它与模块中的real128 具有相同的值”。如果您仍想参考real128,您将需要第二种方法。
    • 在我的代码中,我更喜欢直接使用来自ISO_Fortran_env的常量,即real(REAL128) :: ...1.0_REAL128。这使它更容易阅读。
    【解决方案2】:

    其实很多代码都使用了这种 WP 方法。许多具有 select_*_kind 内在函数。但我认为有一种“更简单”的方法。它使用默认精度而不指定任何种类关键字,并使用编译器的标志来选择默认精度。

    如果您不需要精确控制每个变量的精度,这种方法会更容易。缺点是这将在很大程度上取决于编译器标志,每个编译器都会有所不同,甚至可能不可用。

    对于 gfortran,有更多标志 -freal4-real8-freal4-real16 将每个显式指定的较低精度变量提升为较高精度。

    【讨论】:

    • 这实际上是我认为的首选方法。但我不知道该怎么做。
    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多