将工作代码从双精度转换为四倍精度:如何从输入文件中读取FORTRAN中的四重精度数

时间:2013-08-08 22:17:31

标签: gcc input fortran runtime-error scientific-notation

我有一个很大的旧FORTRAN 77代码已经工作了许多年,没有任何问题。 双精度是不够的,所以要转换为四倍精度,我有:

  1. 将所有出现的REAL * 8替换为REAL * 16
  2. 将所有功能(如DCOS())替换为COS()
  3. 等功能
  4. 将所有内置数字替换为0.d0至0.q0,以及1D + 01至1Q + 01
  5. 该程序使用

    上的gcc-4.6编译器编译时没有错误或警告
    1. 操作系统:openSUSE 11.3 x86_64(64位操作系统)
    2. 硬件:Intel Xeon E5-2650(Sandy Bridge)
    3. 我的LD_LIBRARY_PATH变量设置为64位库文件夹: /gcc-4.6/lib64

      程序读取一个包含数字的输入文件。 这些数字曾经是1.234D + 02的形式(对于代码的双精度版本,它起作用)。 我已经更改了它们,所以现在这个数字是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)中读取输入文件中的四倍精度数字,如果是这样,你是怎么做到的工作? (或者您是否需要不同的编译器/操作系统/硬件才能使其正常工作?)

1 个答案:

答案 0 :(得分:4)

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

我建议将一个小的Fortran 90混合到FORTRAN 77代码中。

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

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

use ISO_FORTRAN_ENV
WP = real128

use ISO_FORTRAN_ENV
WP = real64

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

然后通过以下方式声明您的真实变量:

real (WP) :: MyVar

在源代码中,将实常数写为1.23456789012345E+12_WP_type是Fortran 90指定常量类型的方法。这样,只需更改定义WP

的单行,就可以在双精度和四倍精度之间来回切换

WP ==工作精度。

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

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