我正在運行由其他人編寫的Fortran 77程序。我在Linux上使用gfortran編譯器(v5.4.0)(Ubuntu v.16.04)。我不是Fortran,gcc或bash腳本的經驗豐富的用戶,所以我在這裏掙扎。解釋gfortran錯誤追溯
當我的程序運行完成後,我得到以下信息:
Note: The following floating-point exceptions are signalling: IEEE_DENORMAL
我不得不看這件事 - 據我所知,我的一些浮點數的需要存儲「非正規」,對於很小數量的低精度表格(而不是將它們清零)。這些來自程序中不穩定的空氣動力學計算 - 我在進行計算時看到了這一點。這是不太可能的是,這些非正規量都顯著影響了我的成績,但是,試圖找出/爲什麼這是怎麼回事,我試着用下面的錯誤選項編譯:
gfortran –g –fbacktrace –ffpe-trap=invalid,zero,overflow,underflow,denormal –O3 –mcmodel=medium –o ../program.exe
程序編譯,但在運行時墜毀並返回:
Program received signal SIGFPE: Floating-point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7F442F143E08
#1 0x7F442F142F90
#2 0x7F442EA8A4AF
#3 0x4428CF in subroutine2_ at code.f:3601 (discriminator 3)
#4 0x442C3F in subroutine1_ at code.f:3569
#5 0x4489DA in code_ at code.f:428
#6 0x42BdD1 in MAIN__ at main.f:235
Floating point exception (core dumped)
我可以解釋這些是調用的層次結構,從6比3落後的工作:
* 6。在「main.f」的第235行,有一個問題。 [這是致電「code.f」]
* 5。在「code.f」的第428行,有一個問題。 [這是對「code.f」中的「subroutine1」的調用]
* 4。在「code.f」的第3569行,在「子程序1」中,出現了問題。 [這是對「code.f」中的「subroutine2」的調用]
* 3。在「code.f」的第3601行,在「子程序2」中,出現了問題。 [這是一個條件語句]
if (windspd_2m.ge.5.0) then...
所以非正規錯誤必須在「然後」操作中發生(因爲(a)它涉及到一個長期,複雜的一系列的依賴我沒有將這些代碼,(b)我可以解開數學錯誤,這是我正在努力解決的調試錯誤)。
但是對於上述錯誤2,1,0 ...我不知道如何解釋這些字符串的數字/字母。我也不知道「鑑別器3」的含義。我搜索了這些,但我發現的唯一資源解釋了他們假設的知識水平比我高。任何人都可以幫助我解釋這些錯誤代碼,假設Fortran,gcc或bash腳本的知識已經很少了?
您正處在正確的軌道上。你的程序崩潰是因爲你用'-ffpe-trap = ...'告訴它在浮點異常時崩潰。前三個堆棧幀很可能是對庫或內部函數的調用,它們處理實際的錯誤處理。我不會太擔心這些。 – chw21
好的,謝謝@ chw21!這聽起來像進入源代碼,並找到denom的來源是解決這個問題的最好方法。有可能在計算中保留denom數字是合理的,這取決於它們在哪裏。我會更多地考慮'-ffpe-trap'的控制 - 如果我可以讓它產生一個警告而不是崩潰程序會更好。 –
*編輯:「denom」應該是「denormal」 –