使用下划线来定义种类/精度

时间:2015-05-20 23:54:42

标签: fortran

我一直在使用下划线将一个整数定义为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)可移植 - 不同的编译器/机器可能会给出不同的值巨大的(1_4),例如。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

正如已经回答的那样,这种表示法是标准的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提供的类型定义,该定义较旧。

答案 2 :(得分:2)

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

  

int-literal-constant digit-string [_ kind-param ]
   kind-param digit-string 标量-int-常量名称

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