为了账号安全,请及时绑定邮箱和手机立即绑定

Fortran 90类参数

Fortran 90类参数

慕后森 2019-06-17 16:12:14
Fortran 90类参数我很难理解90年代的Fortran。kind参数。据我所知,它不确定变量的精度(即浮点数或双精度),也不确定变量的类型。那么,它决定了什么,到底是为了什么呢?
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

只是扩展了另一个(非常好的)答案,特别是潘伊科夫答:

变量的类型是一个整数标签,它告诉编译器它应该使用哪些受支持的类型。

一点儿没错。尽管如此,数值内蕴类型时,类别参数用于指定“处理器上数字的表示和行为模型“(标准第16.5节中的单词),实际上是指它们的位模型,这并不是唯一种参数可以表示的东西。

类型的一种参数是任何变化它的性质,模型或行为是程序员可以在编译时选择的。例如,对于内部字符类型,种类参数表示处理器上可获得的字符集(ASCII,UCS-4,.)。

您甚至可以在定义的派生类型上定义自己的模型/行为变体(自Fortran 2003之后)。您可以创建一个Transform矩阵类型,并为2D空间(其中底层数组为3x3)和3D空间(具有4x4底层数组)拥有一个为FORY=2的版本(在该版本中底层数组为3x3)。请记住,对于非内在类型,没有自动的种类转换。


查看完整回答
反对 回复 2019-06-17
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

变量的类型是一个整数标签,它告诉编译器它应该使用哪些受支持的类型。

小心,尽管它是共同若要使种类参数与存储在该类型变量中的字节数相同,则为不需要按照Fortran的标准。

也就是说,在很多系统上,

REAl(KIND=4) :: xs   ! 4 byte ieee float
REAl(KIND=8) :: xd   ! 8 byte ieee float
REAl(KIND=16) :: xq   ! 16 byte ieee float

但是,可能会有编译器,例如:

REAL(KIND=1) :: XS   ! 4 BYTE FLOAT
REAL(KIND=2) :: XD   ! 8 BYTE FLOAT
REAL(KIND=3) :: XQ   ! 16 BYTE FLOAT

类似于整数和逻辑类型。

(如果我去挖,我可能会找到例子。搜索Usenet组comp.lang.fortrankind去找例子。关于Fortran的最有见地的讨论发生在那里,一些非常有经验的人做出了贡献。)

因此,如果不能指望特定类型的值在不同的平台上给出相同的数据表示,您会做什么?这就是内在的功能SELECTED_REAL_KINDSELECTED_INT_KIND都是为了。基本上,你告诉函数你需要表示什么样的数字,它会返回你需要使用的那种数字。

我通常使用这些类型,因为它们通常给我4字节和8字节的reals:

!--! specific precisions, usually same as real and double precision
integer, parameter :: r6 = selected_real_kind(6) 
integer, parameter :: r15 = selected_real_kind(15)

因此,我可能随后将一个变量声明为:

real(kind=r15) :: xd

请注意,这可能会导致使用混合语言程序的问题,您需要绝对指定变量占用的字节数。如果您需要确保,有一些查询本质可以告诉您每种类型,从中可以推断出变量的内存占用、其精度、指数范围等。或者,您可以恢复到非标准但常见的状态。real*4real*8等声明风格。

当您从一个新编译器开始时,值得查看编译器特定种类的值,以便您知道您正在处理的是什么。搜索网络kindfinder.f90对于一个方便的程序,它将告诉您编译器可用的类型。


查看完整回答
反对 回复 2019-06-17
?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

我建议使用Fortran 2008及以后;INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128..这是通过调用ISO_FORTRAN_ENV在Fortran 2003及以后。类参数提供了不一致的方法,以确保始终获得适当的位表示数。


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 686 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信