2017-06-01 578 views
1

我是Fortran的新手,一般編碼,所以如果我的術語不正確,我很抱歉。IEEE_UNDERFLOW_FLAG IEEE_DENORMAL Fortran 77

我正在使用gfortran編譯器的Linux機器。

我在做這個夏天的研究,這涉及到我得到一個寫於1980年左右的程序再次工作。它是用Fortran 77編寫的。我擁有所有的代碼以及一些關於它的文檔。

以目前的形式,我收到「IEEE_UNDERFLOW_FLAG IEEE_DENORMAL」錯誤。我的第一個想法是,這個代碼是爲了在不同的環境/架構下開發的。

該文檔聲明「此程序旨在運行在HARRIS計算機系統上。如果在主代碼和子程序包中單精度變量變爲雙精度變量,它也可以在VAX系統上運行。「

我試過將單精度變量更改爲雙精度變量,但我可能做錯了。如果這是正確的做法,任何見解都會很棒。

我也試着用-std = legacy和-m32編譯編碼。我也收到同樣的錯誤。

任何意見,讓我走在正確的方向將不勝感激。

+0

低於正常水平的產量可能是預期的。這不代表您在選擇構建過程時遇到問題。 – tim18

+0

有關切換到雙精度的說明可能很重要,因爲ieee754 single的屬性可能並不比vax好。 – tim18

+0

Gfortran有自動替換單人的選項。如果考慮到這一點,你應該閱讀文檔。 – tim18

回答

3

「IEEE_UNDERFLOW_FLAG IEEE_DENORMAL is signaling」並不罕見。它是不是錯誤信息

其含義是在運行代碼時生成denormal numbers

它可能是您的代碼中的數字問題的暗示,但它本身不是錯誤。這可能意味着你的程序成功完成。

Fortran在其最新版本中要求在執行STOP語句時報告所有發出信號的浮點異常。請參閱gfortran IEEE exception inexact順便說一句,這也意味着您的程序不會被編譯爲Fortran 77,而是編譯爲Fortran 2003或更高版本。

請注意,即使您通過-std=f95請求了Fortran 95標準,該筆記仍然顯示,但可以通過標記-ffpe-summary=list來控制。

鏈接的答案還表示,避免這些警告的一種方法是不通過STOP聲明完成程序,而是通過運行到END PROGRAM。如果你在你的代碼像

STOP 
END 

STOP 
END PROGRAM 

,只是刪除了STOP,它是無用的,即使不是有害的。

你可能但你不必成功地通過使用雙精度來擺脫那個。如果算法中存在數值問題,即使有雙打,他們也會呆在那裏。但他們可能會變得不那麼明顯。或者他們可能不會,這取決於。您不必爲此重新編寫代碼,只需使用-fdefault-real-8-freal-4-real-8或類似的代碼即可。在您的gfortran manual中詳細瞭解這些選項。你甚至可以嘗試四倍的精度,但通常對於所有合理的算法來說,雙精度就足夠了。

+0

不是「最後」,但只有在遇到「停止」的權利?因此,如果代碼正常終止,並帶有「STOP」 END'去掉'STOP'應該可以解決。 (?) – agentp

+0

是的,這是相關答案的結論。我在這裏也應該強調一下。 –

+0

@VladimirF我不確定這是否會導致錯誤,在閱讀了關於HARRIS系統的更多信息後,它看起來像是在48位計算機上開發的代碼。另外,按照我閱讀gfortran手冊的方式,無法將程序編譯爲Fortran 77,這是否正確?感謝您的所有幫助。 – Robert