使用下划线定义 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
您可以找到其他数据类型的类似信息(但请注意,对于字符,种类参数位于文字常量的前面)。
我一直在使用下划线将整数定义为 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 提供的种类定义,它较旧。
要添加到 1_8
之类的东西适合 R407 和 R408(对于明显的 数字字符串 ):
int-literal-constant is digit-string [_kind-param]
kind-param is digit-string or scalar-int-constant-name
您可以找到其他数据类型的类似信息(但请注意,对于字符,种类参数位于文字常量的前面)。