Fortran 错误:不支持旧式类型声明REAL*16
我得到了一些遗留代码来编译。不幸的是,我只能使用f95编译器,对Fortran一无所知。某些模块已编译,但其他模块出现以下错误:Fortran 错误:不支持旧式类型声明REAL*16,fortran,Fortran,我得到了一些遗留代码来编译。不幸的是,我只能使用f95编译器,对Fortran一无所知。某些模块已编译,但其他模块出现以下错误: 错误:在(1)处不支持旧式类型声明REAL*16 我的计划是至少尝试修复这个错误,看看还会发生什么。这是我的两个问题 我为Fortran 75编写的代码与Fortran 95编译器兼容的可能性有多大?(在/usr/bin中,我的编译器是f95,所以我假设它是Fortran 95) 如何修复我遇到的这个错误?我试着用谷歌搜索,但找不到一个清晰明了的答案 您看到的错误是由
错误:在(1)处不支持旧式类型声明REAL*16
我的计划是至少尝试修复这个错误,看看还会发生什么。这是我的两个问题
您看到的错误是由于一种旧的声明风格造成的,这种风格在Fortran 90之前很常见,但从未成为标准。因此,编译器不接受(形式上不正确的)代码 在Fortran 90之前的旧时代,只有两种类型的实数:
real
和DOUBLE-PRECISION
。这些类型依赖于平台,但现在大多数编译器将它们映射到binary32和binary64
然而,有些机器提供不同的格式,通常具有更高的精度。为了使Fortran代码能够访问它们,发明了REAL*n
类型,其中n
是一组依赖于编译器的值中的整数文本。这种语法从来都不是标准的,所以如果不阅读它的文档,就无法确定它对给定编译器意味着什么
在现实世界中,大多数未被要求严格遵守标准的编译器(带有一些选项,如-std=f95
)将至少识别real*4
和real*8
,将它们映射到前面提到的二进制32/64格式,但其他一切都完全依赖于平台。对于x86 387 FPU使用的80位算术,编译器可能有REAL*10
类型,或者对于某些128位浮点算术,编译器可能有REAL*16
类型。但是,需要强调的是,由于语法不是标准的,因此该类型的含义可能会因编译器而异
最后,在Fortran 90中,一种引用不同类型的实数和整数类型的方法成为标准。新语法是REAL(n)
或REAL(kind=n)
,所有符合标准的编译器都支持这种语法。然而,n的值仍然依赖于编译器,但该标准提供了三种方法来获得特定的、可重复的结果:
函数,允许您在系统中查询n值,以指定是否需要具有特定精度和范围要求的实数类型。通常,您所做的是请求它一次,并将结果存储在一个SELECTED\u REAL\u KIND
变量中,您在声明有问题的实际变量时使用该变量。例如,您可以声明一个精度至少为15位(十进制)且指数范围至少为100的类型,如下所示:整数、参数
INTEGER, PARAMETER :: rk = SELECTED_REAL_KIND(15, 100) REAL(rk) :: v
- 在Fortran 2003及以后的版本中,
模块包含一系列常量,用于确保类型与同一编译器系列的C类型等效(例如,gcc用于gfortran,icc用于ifort等)。它们被称为ISO_C_BINDING
,C_FLOAT
和C_DOUBLE
。因此,您可以将相当于CC_LONG_DOUBLE
的变量声明为double
REAL(C\u double)::d
- 在Fortran 2008及以后版本中,
模块包含一系列不同的常量ISO_Fortran_ENV
、REAL32
和REAL64
,这些常量将为适当宽度的浮点类型-如果某些平台不支持其中一种类型,则常量将为负数。因此,您可以将128位浮点声明为REAL128
REAL(real128)::q
- 您看到的错误是由于旧的声明样式造成的,该样式在Fortran 90之前很常见,但从未成为标准。因此,编译器不接受(形式上不正确的)代码
在Fortran 90之前的旧时代,只有两种类型的实数:
real
和DOUBLE-PRECISION
。这些类型依赖于平台,但现在大多数编译器将它们映射到binary32和binary64
然而,有些机器提供不同的格式,通常具有更高的精度。为了使Fortran代码能够访问它们,发明了REAL*n
类型,其中n
是一组依赖于编译器的值中的整数文本。这种语法从来都不是标准的,所以如果不阅读它的文档,就无法确定它对给定编译器意味着什么
在现实世界中,大多数未被要求严格遵守标准的编译器(带有一些选项,如-std=f95
)将至少识别real*4
和real*8
,将它们映射到前面提到的二进制32/64格式,但其他一切都完全依赖于平台。对于x86 387 FPU使用的80位算术,编译器可能有REAL*10
类型,或者对于某些128位浮点算术,编译器可能有REAL*16
类型。但是,需要强调的是,由于语法不是标准的,因此该类型的含义可能会因编译器而异
最后,在Fortran 90中,一种引用不同类型的实数和整数类型的方法成为标准。新语法是REAL(n)
或REAL(kind=n)
,所有符合标准的编译器都支持这种语法。然而,n的值仍然依赖于编译器,但该标准提供了三种方法来获得特定的、可重复的结果:
函数,允许您在系统中查询n的值,以指定是否需要具有一定精度和精度的实数类型SELECTED\u REAL\u KIND
Error: Old-style type declaration REAL*16 not supported at (1)
Error: Kind 16 not supported for type REAL at (1)