這是一個簡短的問題,但我儘量給予儘可能多的細節。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