Fortran-将程序从32位机器重新编译到64位机器
我有一个非常旧的程序,我想在我的64位计算机上运行。有很多折旧的报表。在调试过程中,我发现很多变量变为NaN或无穷大。。。因此,我将变量的长度从4字节改为8字节(即从实数改为实数*8),但现在两台计算机上的计算和结果相差很大。有人能解释一下,如果我使用更长的类型,这是否真的很重要,为什么在32位计算机上一切正常,但在64位计算机上,我得到无穷大和NaN值 另外,我使用gfortran编译器和Fortran-将程序从32位机器重新编译到64位机器,fortran,gfortran,Fortran,Gfortran,我有一个非常旧的程序,我想在我的64位计算机上运行。有很多折旧的报表。在调试过程中,我发现很多变量变为NaN或无穷大。。。因此,我将变量的长度从4字节改为8字节(即从实数改为实数*8),但现在两台计算机上的计算和结果相差很大。有人能解释一下,如果我使用更长的类型,这是否真的很重要,为什么在32位计算机上一切正常,但在64位计算机上,我得到无穷大和NaN值 另外,我使用gfortran编译器和-fbackslash-ffix-line-length-0-std=legacy-g-O0-fno-in
-fbackslash-ffix-line-length-0-std=legacy-g-O0-fno-inline
选项
问候,,
kozooh您的问题可能是由于编译器之间的差异,而不是机器的位级别之间的差异。例如,一些FORTRAN 77编译器隐式地将
save
应用于所有过程(子例程和函数)局部变量。这不是标准所要求的,不应依赖此行为。当使用现代编译器编译遗留程序时,如果局部变量的值在过程调用期间保留,则需要使用save
,这通常会导致问题。我不知道77国集团是否有这个“特点”。您可以使用编译器选项-fno automatic
在gfortran中启用此行为
编辑:考虑:
subroutine MySub
logical FirstCall
save FirstCall
data FirstCall / .TRUE. /
integer I
if ( FirstCall ) then
I = 0
FirstCall = .FALSE.
end if
I = I + 1
write (6, *) "Call", I
end
program main
integer j
do j=1, 4
call MySub ()
end do
end program main
使用77国集团编译(无编译器选项),输出为:
Call 1
Call 2
Call 3
Call 4
Call 1
Call 2
Call 3
Call 129
局部变量I
在调用MySub
时保持其值。因此,77国集团似乎正在保存局部变量,即使没有使用save
请求。至少在默认的优化级别
使用gfortran编译,带有选项fbackslash-ffix-line-length-0-std=legacy-g-O0-fno inline
输出相同。现在切换到-O3
,输出为:
Call 1
Call 2
Call 3
Call 4
Call 1
Call 2
Call 3
Call 129
有时I
保留其值,有时不保留
将程序的一行更改为:save FirstCall,I
,该值始终保留:
Call 1
Call 2
Call 3
Call 4
请尝试
-fno automatic
..在两台计算机上都使用gfortran吗?不,在32位计算机上,我使用g77编译器。