4

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

  1. 将所有出现的 REAL 8 替换为 REAL 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 似乎不允许以科学计数法从输入文件中读取四精度数字!

有没有人能够在 FORTRAN 中使用 gcc 编译器从输入文件中读取科学记数法的四精度数(例如 1234Q+02),如果是,你是如何让它工作的?(或者你需要不同的编译器/操作系统/硬件来让它工作吗?)

4

1 回答 1

4

@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

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

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

real (WP) :: MyVar

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

WP == 工作精度。

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

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

于 2013-08-11T00:58:55.250 回答