使用下划线定义 kind/precision

Using underscores to define kind/precision

我一直在使用下划线将整数定义为 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

哪个 returns(使用 PGI 或 gfortran):

32767
32767
2147483647
2147483647
9223372036854775807
9223372036854775807

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

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

正在使用 _KIND 标准 Fortran 语言吗?有人有这方面的资源吗?

编辑:有人指出我使用的 kind 值 (2,4,8) not portable - 不同的 compilers/machines 可能给出不同的值对于巨大的(1_4),例如。

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

Fortran 标准是 "standard" Fortran 的权威来源。 ISO/IEC 1539-1:2010 是当前版本,您可以购买,或者可以从各个地方获得该文档的出版前草稿。 https://gcc.gnu.org/wiki/GFortranStandards 有一组有用的链接。

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

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

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

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 提供的种类定义,它较旧。

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

int-literal-constant is digit-string [_kind-param]
kind-param is digit-string or scalar-int-constant-name

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