我有一个很大的、旧的、FORTRAN 77 代码,它已经运行了很多年,没有任何问题。
double 已经不够了,所以要转换为四精度,我有:
该程序在使用 gcc-4.6 编译器的情况下编译时没有错误或警告
我的 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
需要在 program
和 implicit 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/