IMPLICIT NONE
和已经提到的编译器选项。
让我们谈谈浮点运算。问题是(这里提到的 ss)MATLAB 根据IEEE® 标准 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 标准的单精度浮点数类型。
So it might be the source of bugs. The precision is lost somewhere, some variable becomes equal to 0.0 instead of being slightly bigger/smaller the 0.0 and then you divide by this value (which is exactly 0.0). Well, it can freeze the program.