我有一个很大的、旧的、FORTRAN 77 代码,它已经运行了很多年,没有任何问题。
double 已经不够了,所以要转换为四精度,我有:

  • 将所有出现的 REAL8 替换为 REAL16
  • 将 DCOS() 等所有函数替换为 COS() 等函数
  • 替换了所有内置数字,如 0.d0 到 0.q0 和 1D+01 到 1Q+01

  • 该程序在使用 gcc-4.6 编译器的情况下编译时没有错误或警告
  • 操作系统:openSUSE 11.3 x86_64(64 位操作系统)
  • 硬件:Intel Xeon E5-2650 (Sandy Bridge)

  • 我的 LD_LIBRARY_PATH 变量设置为 64 位库文件夹:
    /gcc-4.6/lib64
    该程序读取一个包含数字的输入文件。
    这些数字曾经是 1.234D+02 的形式(对于代码的 double 版本,有效)。
    我已经改变了它们,所以现在这个数字是 1.234Q+02 ,但是我得到了运行时错误:
    列表输入项 1 中的错误实数
    指示从输入文件(称为 read.f)读入数据的子例程没有找到输入文件中的第一个数字,以与它预期的内容兼容。
    奇怪的是,当输入文件包含 1.234D+02 或 123.4 之类的数字时,代码的四倍精度版本不会提示(根据输出,这些数字似乎会自动转换为 1.234D+02 而不是 Q+02 ),它只是不喜欢 Q+02 ,所以似乎 gcc-4.6 不允许从输入文件中以科学记数法读取四倍精度的数字!
    有没有人曾经能够使用 gcc 编译器在 FORTRAN 中从输入文件中读取科学记数法中的四倍精度数(即,如 1234Q+02),如果是这样,你是如何让它工作的? (或者您是否需要不同的编译器/操作系统/硬件才能使其工作?)

    最佳答案

    几乎所有这些都已经在@IanH 和@Vladimi 的评论中。

    我建议在你的 FORTRAN 77 代码中加入一点 Fortran 90。

    用“E”写出你所有的数字。更改您的其他程序以这种方式写入数据。不要理会“D”,也不要尝试使用很少支持的“Q”。 (在源代码的常量中使用“Q”是 gfortran 的扩展——参见手册中的 6.1.8。)

    由于您希望相同的源代码支持两种精度,因此在程序顶部,具有:

    use ISO_FORTRAN_ENV
    WP = real128
    

    或者
    use ISO_FORTRAN_ENV
    WP = real64
    

    作为改变您的代码是使用 double 还是四倍精度的变体。这是使用 ISO Fortran 环境按位数选择类型。 ( use 需要在 programimplicit none 之间; implicit none 之后的赋值语句。)

    然后通过以下方式声明您的真实变量:
    real (WP) :: MyVar
    

    在源代码中,将实常数写为 1.23456789012345E+12_WP_type 是 Fortran 90 指定常量类型的方法。这样,您只需更改定义 WP 的单行即可在 double 和四倍精度之间来回切换

    WP == 工作精度。

    只需在输入文件中使用“E”。 Fortran 将根据变量的类型进行读取。

    为什么不写一个小测试程序来试一试呢?

    关于gcc - 将工作代码从 double 转换为四精度 : How to read quadruple-precision numbers in FORTRAN from an input file,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18137127/

    10-14 03:21