2013-07-26 107 views
1

我有一个非常老的程序,我想在我的64位计算机上运行。有很多折旧报表。在调试过程中,我发现很多变量变成NaN或Infinity ...因此,我将变量从4字节改为8字节(即REAL变为REAL * 8),但现在两个计算机上的计算和结果都大不相同。如果我使用更长的类型以及为什么在32位计算机上一切正常,但是在64位上,我可以获得Infinity和NaN值吗?有人可以解释我吗?Fortran - 从32bit到64bit机器重新编译程序

P.S.我用gfortran编译器选项-fbackslash -ffixed-line-length-0 -std=legacy -g -O0 -fno-inline

问候, kozooh

+0

你在两台计算机上使用gfortran? –

+0

不,在32位我使用g77 compilator。 – kozooh

回答

2

你的问题很可能是由于编译器之间,而不是机器的位水平之间的差异。例如,一些FORTRAN 77编译器隐式地将save应用于所有过程(子例程和函数)局部变量。这不是标准所要求的,不应该依赖这种行为。如果使用现代编译器编译传统程序,则需要使用save时,如果局部变量应该跨过某个过程的调用保留其值,则这经常会导致问题。我不知道g77是否有这个“功能”。您可以使用编译器选项-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 

与G77编译(没有编译器选项),输出为:

Call 1 
Call 2 
Call 3 
Call 4 

局部变量I跨越的MySub调用并保持其值。所以看起来g77即使在没有请求save时也保存局部变量。至少在默认的优化级别。

编译与gfortran与选项fbackslash -ffixed-line-length-0 -std=legacy -g -O0 -fno-inline输出是相同的。现在改为-O3和输出是:

Call   1 
Call   2 
Call   3 
Call   129 

有时I保留其值,有时没有。

改变一个程序的行:save FirstCall, I和值始终保留:

Call 1 
Call 2 
Call 3 
Call 4 

尝试-fno-automatic ...