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

use*_*772 4 gcc fortran runtime-error scientific-notation input

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

  1. 替换所有出现的REAL*8toREAL*16
  2. 将所有 DCOS() 等函数替换为 COS() 等函数
  3. 替换了所有内置数字,例如 0.d0 到 0.q0 以及 1D+01 到 1Q+01

使用 gcc-4.6 编译器编译该程序,没有错误或警告

  1. 操作系统:openSUSE 11.3 x86_64(64位操作系统)
  2. 硬件:Intel Xeon E5-2650(Sandy Bridge)

我的 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),如果是这样,你是如何让它工作的?(或者您是否需要不同的编译器/操作系统/硬件才能使其工作?)

M. *_* B. 5

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

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

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

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

use ISO_FORTRAN_ENV
WP = real128
Run Code Online (Sandbox Code Playgroud)

或者

use ISO_FORTRAN_ENV
WP = real64
Run Code Online (Sandbox Code Playgroud)

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

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

real (WP) :: MyVar
Run Code Online (Sandbox Code Playgroud)

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

WP == 工作精度。

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

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