gpt4 book ai didi

fortran - 错误 : Old-style type declaration REAL*16 not supported

转载 作者:行者123 更新时间:2023-12-02 15:11:01 29 4
gpt4 key购买 nike

我得到了一些要编译的遗留代码。不幸的是,我只能访问 f95 编译器并且对 Fortran 的了解为 0。一些模块已编译,但其他模块出现此错误:

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

我的计划是至少尝试修复此错误,然后看看还会发生什么。所以这是我的 2 个问题。

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

  2. 如何解决我遇到的这个错误?我尝试用谷歌搜索它,但找不到清晰明了的答案。

最佳答案

您看到的错误是由于 Fortran 90 之前很常见但从未成为标准的旧声明样式造成的。因此,编译器不接受(形式上不正确的)代码。

在 Fortran 90 之前的过去,只有两种类型的实数:REALDOUBLE PRECISION。这些类型依赖于平台,但大多数编译器现在将它们映射到 IEEE754 formats binary32 和 binary64。

但是,一些机器提供不同的格式,通常具有更高的精度。为了使 Fortran 代码可以访问它们,发明了 REAL*n 类型,其中 n 是一组依赖于编译器的值的整数文字。这种语法从来都不是标准的,所以如果不阅读它的文档,你就无法确定它对给定编译器意味着什么。

在现实世界中,大多数未被要求严格符合标准的编译器(带有一些选项,如 -std=f95)将至少识别 REAL*4REAL*8,将它们映射到前面提到的二进制 32/64 格式,但其他一切都完全依赖于平台。对于 x86 387 FPU 使用的 80 位算法,您的编译器可能具有 REAL*10 类型,或者对于 x86 387 FPU 使用的 REAL*16 类型一些 128 位 float 学。但是,需要强调的是,由于语法不是标准的,因此该类型的含义可能因编译器而异。

最后,在 Fortran 90 中,一种引用不同种类实数和整数类型的方法成为标准。新语法是 REAL(n)REAL(kind=n) 并且受所有符合标准的编译器支持。然而,n 的值仍然依赖于编译器,但该标准提供了三种方法来获得特定的、可重复的结果:

  • SELECTED_REAL_KIND 函数,它允许您向系统查询 n 的值,以指定您是否需要具有特定精度和范围要求的实数类型。通常,您所做的是请求它一次并将结果存储在一个 INTEGER, PARAMETER 变量中,您在声明相关的实际变量时使用该变量。例如,您可以像这样声明一个精度至少为 15 位(十进制)且指数范围至少为 100 的类型:

    INTEGER, PARAMETER :: rk = SELECTED_REAL_KIND(15, 100)
    REAL(rk) :: v
  • 在 Fortran 2003 及以后的版本中,ISO_C_BINDING 模块包含一系列常量,旨在为您提供保证等同于同一编译器系列的 C 类型的类型(例如 gfortran 的 gcc, icc 用于 ifort 等)。它们被称为 C_FLOATC_DOUBLEC_LONG_DOUBLE。因此,您可以将等效于 C double 的变量声明为 REAL(C_DOUBLE)::d
  • 在 Fortran 2008 及以后的版本中,ISO_FORTRAN_ENV 模块包含一系列不同的常量 REAL32REAL64REAL128 这将为您提供适当宽度的浮点类型 - 如果某些平台不支持其中一种类型,则常量将为负数。因此,您可以将 128 位 float 声明为 REAL(real128)::q

关于fortran - 错误 : Old-style type declaration REAL*16 not supported,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43810421/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com