2013-04-22 69 views
2

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

回答

9

您的代碼看起來不像FORTRAN 77,CPU_TIME來自Fortran 95.無論如何,您的調試選項非常嚴格。 -ffpe-trap=invalid,zero,overflow,underflow,precision意味着浮點運算的許多合法用途都會導致異常。我建議只使用-ffpe-trap=invalid,zero,overflow

具體從gfortran手冊:

Some of the routines in the Fortran runtime library, like CPU_TIME , 
are likely to trigger floating point exceptions when "ffpe-trap=precision" 
is used. For this reason, the use of "ffpe-trap=precision" is not recommended. 
+0

謝謝你,這是一個很好的答案! – dmon 2013-04-22 13:33:30