我有一个很大的旧FORTRAN 77代码已经工作了许多年,没有任何问题。 双精度是不够的,所以要转换为四倍精度,我有:
该程序使用
上的gcc-4.6编译器编译时没有错误或警告我的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)中读取输入文件中的四倍精度数字,如果是这样,你是怎么做到的工作? (或者您是否需要不同的编译器/操作系统/硬件才能使其正常工作?)
答案 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
需要在program
和implicit none
之间; implicit none
之后的作业声明。)
然后通过以下方式声明您的真实变量:
real (WP) :: MyVar
在源代码中,将实常数写为1.23456789012345E+12_WP
。 _type
是Fortran 90指定常量类型的方法。这样,只需更改定义WP
WP ==工作精度。
只需在输入文件中使用“E”即可。 Fortran将根据变量的类型进行读取。
为什么不写一个很小的测试程序来试试呢?