【问题标题】:Using underscores to define kind/precision使用下划线定义种类/精度
【发布时间】:2015-05-20 23:54:41
【问题描述】:

我一直在使用下划线将整数定义为 fortran 中的特定类型。

这里有一段代码用来演示1_8 的含义,例如:

  program main
  implicit none

  integer(2) :: tiny
  integer(4) :: short
  integer(8) :: long

  tiny = 1
  short = 1
  long = 1

  print*, huge(tiny)
  print*, huge(1_2)

  print*, huge(short)
  print*, huge(1_4)

  print*, huge(long)
  print*, huge(1_8)

  end program main

哪个返回(使用 PGI 或 gfortran):

32767
32767
2147483647
2147483647
9223372036854775807
9223372036854775807

我正在使用huge 内部函数来返回给定种类的最大数量。所以1_8 显然与整数(8)是同一种。这也适用于实数,虽然我没有在这里展示。

但是,我一直无法找到有关此功能的任何文档,并且我不记得我是从哪里学到的。我的问题是:

是否使用_KIND 标准fortran?有人有这方面的资料吗?

编辑:有人指出,我使用的类型值 (2,4,8) 不是可移植的 - 不同的编译器/机器可能会为 huge(1_4) 提供不同的值,例如例子。

【问题讨论】:

    标签: fortran


    【解决方案1】:

    从 Fortran 90 开始,它是标准的 Fortran,尽管每种类型的有效种类值集和种类值的含义取决于处理器。

    Fortran 标准是“标准”Fortran 的权威来源。 ISO/IEC 1539-1:2010 是当前版本,您可以购买它,或者该文件的预发布草稿可从各个地方获得。 https://gcc.gnu.org/wiki/GFortranStandards 有一系列有用的链接。

    我希望许多编译器手册(例如 - 参见当前 PGI Fortran reference manual 的第 2.2 节)和所有关于现代 Fortran 的合理教科书也会描述此功能。

    【讨论】:

      【解决方案2】:

      正如已经回答的那样,这种表示法是标准的 fortran,但是将这些特定的数值用于种类是不可移植的。以前的答案已经描述了使用其他方案的编译器。还有其他几种可移植的方法。

      首先,使用 kind 方案定义符号,然后将这些符号用于数字常量:

      integer, parameter :: RegInt_K = selected_int_kind (8)
      write (*, *) huge (1_RegInt_K)
      

      或者使用 ISO_FORTRAN_ENV 模块中提供的种类定义,例如,

      write (*, *) huge (1_int32)
      

      该模块的种类由用于存储的位数指定。有些种类仅适用于 Fortran 2008。如果您的编译器中缺少这些种类,您可以使用 ISO_C_BINDING 提供的种类定义,它是较旧的。

      【讨论】:

      • 好点,谢谢。我知道这一点,但会对该问题进行编辑,以便其他人也可以肯定。
      【解决方案3】:

      要添加到IanH's answer,Fortran 2008 中整数文字常量的规范在 4.4.2.2 中给出。 1_8 之类的东西适合 R407 和 R408(对于明显的 digit-string):

      int-literal-constant 数字字符串 [_kind-param]
      kind-param is digit-string or scalar-int-constant-name

      对于其他数据类型,您可以找到类似的(尽管请注意,对于字符,种类参数位于文字常量的前面)。

      【讨论】:

        猜你喜欢
        • 2016-01-31
        • 1970-01-01
        • 2013-10-30
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 2020-02-03
        相关资源
        最近更新 更多