Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 错误:不支持旧式类型声明REAL*16_Fortran - Fatal编程技术网

Fortran 错误:不支持旧式类型声明REAL*16

Fortran 错误:不支持旧式类型声明REAL*16,fortran,Fortran,我得到了一些遗留代码来编译。不幸的是,我只能使用f95编译器,对Fortran一无所知。某些模块已编译,但其他模块出现以下错误: 错误:在(1)处不支持旧式类型声明REAL*16 我的计划是至少尝试修复这个错误,看看还会发生什么。这是我的两个问题 我为Fortran 75编写的代码与Fortran 95编译器兼容的可能性有多大?(在/usr/bin中,我的编译器是f95,所以我假设它是Fortran 95) 如何修复我遇到的这个错误?我试着用谷歌搜索,但找不到一个清晰明了的答案 您看到的错误是由

我得到了一些遗留代码来编译。不幸的是,我只能使用f95编译器,对Fortran一无所知。某些模块已编译,但其他模块出现以下错误:

错误:在(1)处不支持旧式类型声明REAL*16

我的计划是至少尝试修复这个错误,看看还会发生什么。这是我的两个问题

  • 我为Fortran 75编写的代码与Fortran 95编译器兼容的可能性有多大?(在/usr/bin中,我的编译器是f95,所以我假设它是Fortran 95)

  • 如何修复我遇到的这个错误?我试着用谷歌搜索,但找不到一个清晰明了的答案


  • 您看到的错误是由于一种旧的声明风格造成的,这种风格在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的值仍然依赖于编译器,但该标准提供了三种方法来获得特定的、可重复的结果:

    • SELECTED\u REAL\u KIND
      函数,允许您在系统中查询n值,以指定是否需要具有特定精度和范围要求的实数类型。通常,您所做的是请求它一次,并将结果存储在一个
      整数、参数
      变量中,您在声明有问题的实际变量时使用该变量。例如,您可以声明一个精度至少为15位(十进制)且指数范围至少为100的类型,如下所示:

      INTEGER, PARAMETER :: rk = SELECTED_REAL_KIND(15, 100)
      REAL(rk) :: v
      
    • 在Fortran 2003及以后的版本中,
      ISO_C_BINDING
      模块包含一系列常量,用于确保类型与同一编译器系列的C类型等效(例如,gcc用于gfortran,icc用于ifort等)。它们被称为
      C_FLOAT
      C_DOUBLE
      C_LONG_DOUBLE
      。因此,您可以将相当于C
      double
      的变量声明为
      REAL(C\u double)::d
    • 在Fortran 2008及以后版本中,
      ISO_Fortran_ENV
      模块包含一系列不同的常量
      REAL32
      REAL64
      REAL128
      ,这些常量将为适当宽度的浮点类型-如果某些平台不支持其中一种类型,则常量将为负数。因此,您可以将128位浮点声明为
      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的值仍然依赖于编译器,但该标准提供了三种方法来获得特定的、可重复的结果:

        • SELECTED\u REAL\u KIND
          函数,允许您在系统中查询n的值,以指定是否需要具有一定精度和精度的实数类型
          Error: Old-style type declaration REAL*16 not supported at (1)
          
          Error: Kind 16 not supported for type REAL at (1)