IMPLICIT NONE
и опция компилятора уже упомянута.
Давайте поговорим об арифметике с плавающей точкой. Проблема заключается в том, что (упомянутые здесь здесь ) 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
Таким образом, реальный тип по умолчанию Фортрана не равен стандартному типу с плавающей точкой одинарной точности IEEE.
Так что это может быть источником ошибок. Точность где-то теряется, некоторая переменная становится равной 0,0, а не немного больше / меньше 0,0, а затем вы делитесь на это значение (которое в точности равно 0,0). Ну, это может заморозить программу.