Стандартный Fortran требует, чтобы логические, целочисленные и вещественные значения по умолчанию имели одинаковый размер (числовая единица хранения). Если вы увеличиваете реальное, но не другие, вы нарушаете это предположение, и если какой-то код полагается на это, оно будет нарушено.
гда использовал-fdefault-real-8
вариантgfortran
автоматически продвигать каждыйREAL
объявлено где-нибудь в программе, чтобы удвоить точность,наряду с любой константой, например 1.23
, Если я когда-нибудь захотел вернуться к одинарной точности, мне нужно было только удалить эту опцию и перекомпилировать, не меняя ни одного символа в исходном коде.
В какой-то момент я начал использоватьISO_FORTRAN_ENV
модуль, так как он позволяет мне использовать такие константы, какINPUT|OUTPUT|ERROR_UNIT
, также как иIOSTAT_END
а такжеIOSTAT_EOR
и другие (что казалось хорошим и легким шагом в направлении мобильности, я не прав?). С тех пор я вижу и игнорирую следующее предупреждение
Warning: Use of the NUMERIC_STORAGE_SIZE named constant from intrinsic module ISO_FORTRAN_ENV at (1) is incompatible with option -fdefault-real-8
поскольку такая несовместимость, похоже, пока не действует.
Теперь я хотел бы избавиться от этого предупреждения, если это возможно и стоит того.
Если я правильно понял, чтобы избежать этого предупреждения, я должен отказаться от-fdefault-real-8
вариант и изменить каждыйREAL
вREAL(real64)
и / или REAL(dp)
(при условии, что в последнем случаеUSE, INTRINSIC :: ISO_FORTRAN_ENV, dp => real64
находится в этом блоке), что не является сложной задачей дляsed
или жеvim
.
Тем не менее, мне кажется, что это изменение не будет таким же, как использование-fdefault-real-8
вариант, так каквсе константы останутся с одинарной точностью пока я не добавлюd0
им. Предположил-fdefault-real-8
опция удалена иISO_FORTRAN_ENV,
используется где угодно, есть ли способ заставить любую константу во всей программе вести себя так, какd0
суффикс? Возможно ли это, правильно ли я экстраполировал, чтобы я мог поместить следующие строки в один модуль, который используется всеми другими программными модулями, каждый из которых может затем использоватьdp
как параметр типа типа?
USE, INTRINSIC :: ISO_FORTRAN_ENV
INTEGER, PARAMETER :: dp = real64
Я бы предпочел этот путь, так как я мог бы переключиться наreal32
или жеreal128
или что угодно, изменив только эту строку.