IMPLICIT NONE
和編譯器選項已經提到。
讓我們來談談浮點運算。問題在於(MATLAB提到的here)MATLAB根據IEEE® Standard 754構造了雙精度(或雙精度)和單精度(或單精度)數據類型,但Fortran標準並不要求它是默認的,雙精度實數來符合這個標準。正如您可以看到標準文檔甚至使用其他名稱(默認爲真,而不是單精度)。
MODULE kinds
IMPLICIT NONE
INTEGER, PARAMETER :: fortran_default = kind(0.0)
INTEGER, PARAMETER :: fortran_double = kind(0.0D0)
INTEGER, PARAMETER :: ieee_single = selected_real_kind(7, 38)
INTEGER, PARAMETER :: ieee_double = selected_real_kind(15, 307)
END MODULE kinds
在我的種規格的前兩個字符串中,我用方便的方法來獲得默認實數和雙精度實數的種類。接下來的兩種對應於提到的IEEE標準。
PROGRAM main
USE kinds
IMPLICIT NONE
REAL(kind=ieee_single) :: is
REAL(kind=ieee_double) :: id
REAL(kind=fortran_default) :: fs
REAL(kind=fortran_double) :: fd
PRINT *, kind(is), precision(is), range(is)
PRINT *, kind(id), precision(id), range(id)
PRINT *, kind(fs), precision(fs), range(fs)
PRINT *, kind(fd), precision(fd), range(fd)
END PROGRAM main
我的機器(的Mac OS X 10.6,gfortran 4.5.1)上的輸出是:
8 15 307
8 15 307
4 6 37
8 15 307
所以Fortran語言的默認實樣不等於IEEE標準的單精度浮點數的那種。
所以它可能是錯誤的來源。精度在某處丟失,某些變量等於0.0,而不是略大於0.0,然後除以該值(正好爲0.0)。那麼,它可以凍結該程序。
非常感謝,特別是關於-fdefault-real-8標誌的提示。你知道是否還有一個-fdefault-real-4標誌嗎?我在gfortran上嘗試過,但它似乎沒有工作...... – gvrocha 2010-08-24 19:40:13
我不這麼認爲,因爲那只是默認設置。 – 2010-08-24 19:52:09
所以真正的默認值不是架構依賴呢? – gvrocha 2010-08-24 19:57:49