这是一个简短的问题,但我尽量给予尽可能多的细节。Fortran算术异常
我正在编译一个旧的,但仍然积极开发的科学Linux上的Fortran代码(f77标准)。此代码的推荐编译器是ifort和gfortran。使用gfortran我可以编译并运行这段代码。但是,如果我使用DEBUG = 1标志编译代码,但会以SEG FAULT结束。使用gdb步进通过导致错误的下列来源:
Program received signal SIGFPE, Arithmetic exception.
timer (init=1, isecs=0) at myprog.f:1818
1818 ISECS = 100*INT(TIME_CURRENT)
如果我停止线1818的执行和检查ISECS和TIME_CURRENT我得到:
REAL*4 TIME_CURRENT
CALL CPU_TIME(TIME_CURRENT)
ISECS = 100*INT(TIME_CURRENT)
该程序将终止
(gdb) ptype(TIME_CURRENT)
type = real(kind=4)
(gdb) ptype(ISECS)
type = integer(kind=4)
我试过更具体和使用:
ISECS = 100*INT(TIME_CURRENT,4)
但它没有帮助。我看不出这是如何等于算术错误?
我(生成生成文件)调试编译标志是:
gfortran -fno-automatic -m32 -O0 -g \
-ffpe-trap=invalid,zero,overflow,underflow,precision -static-libgfortran
当我编译了调试的我不再收到赛格的错,但我的编译标志
gfortran -fno-automatic -m32 -O2 -ffast-math -static-libgfortran
我不是Fortran程序员,所以任何援助将不胜感激。请注意,我正在编译64位系统,但强制32位编译,因为这是必需的。
谢谢你,这是一个很好的答案! – dmon 2013-04-22 13:33:30