Стандартный 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 или что угодно, изменив только эту строку.

Ответы на вопрос(1)

Ваш ответ на вопрос