Параметр вида Fortran 90
У меня возникли проблемы с пониманием параметра kind
Fortran 90. Насколько я могу судить, он не определяет точность (т. Е. Float или double) переменной и не определяет тип переменной.
Итак, что он определяет и для чего именно?
KIND переменной – это целочисленная метка, которая сообщает компилятору, какой из поддерживаемых им видов он должен использовать.
Помните, что хотя параметр KIND является таким же, как количество байтов, хранящихся в переменной этого KIND, это не требуется стандартом Fortran.
То есть, на множестве систем,
REAl(KIND=4) :: xs ! 4 byte ieee float REAl(KIND=8) :: xd ! 8 byte ieee float REAl(KIND=16) :: xq ! 16 byte ieee float
но могут быть компиляторы, например:
REAL(KIND=1) :: XS ! 4 BYTE FLOAT REAL(KIND=2) :: XD ! 8 BYTE FLOAT REAL(KIND=3) :: XQ ! 16 BYTE FLOAT
Аналогично для целых и логических типов.
(Если бы я пошел копать, я мог бы, вероятно, найти примеры. Поиск в группе usenet comp.lang.fortran для поиска, чтобы найти примеры. Наиболее информированное обсуждение Fortran происходит там, причем некоторые высокопрофессиональные люди вносят свой вклад.)
Итак, если вы не можете рассчитывать на какое-то определенное значение, дающее вам то же представление данных на разных платформах, что вы делаете? Вот для чего нужны внутренние функции SELECTED_REAL_KIND
и SELECTED_INT_KIND
. В принципе, вы говорите функции, какие номера вам нужно представлять, и она вернет тот вид, который вам нужно использовать.
Обычно я использую эти виды, поскольку они обычно дают мне 4 байта и 8 байтов:
!--! specific precisions, usually same as real and double precision integer, parameter :: r6 = selected_real_kind(6) integer, parameter :: r15 = selected_real_kind(15)
Поэтому я мог бы впоследствии объявить переменную как:
real(kind=r15) :: xd
Обратите внимание, что это может вызвать проблемы, когда вы используете программы смешанного языка, и вам нужно абсолютно указать количество байтов, которые занимают переменные. Если вам нужно убедиться, есть внутренние запросы запроса, которые расскажут вам о каждом виде, из которого вы можете вывести объем памяти переменной, ее точность, диапазон экспоненциальности и т. Д. Или вы можете вернуться к нестандартному, но обыденному real*4
стилю декларации real*4
, real*8
etc.
Когда вы начинаете с нового компилятора, стоит посмотреть на специальные значения для компилятора, чтобы вы знали, с чем имеете дело. Найдите сеть для kindfinder.f90
для удобной программы, которая расскажет вам о доступных для компилятора типах.
Я предлагаю использовать Fortran 2008 и более поздние версии; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128
. Это делается путем вызова ISO_FORTRAN_ENV
в Fortran 2003 и более поздних версиях. Добрые параметры предоставляют непоследовательный способ обеспечения того, чтобы вы всегда получали соответствующее количество битовых представлений
В Portland Group Fortran Reference параметр KIND
«задает точность для встроенных типов данных». Таким образом, в декларации
real(kind=4) :: float32 real(kind=8) :: float64
переменная float64
объявленная как 8-байтная реальная (старая Fortran DOUBLE PRECISION
), и переменная float32
объявляется как 4-байтовый реальный (старый Fortran REAL
).
Это хорошо, потому что это позволяет вам фиксировать точность для ваших переменных независимо от компилятора и машины, на которой вы работаете. Если вы выполняете вычисления, требующие большей точности, то традиционная реальность IEEE с одной точностью (которая, если вы используете class численного анализа, очень вероятна), но объявляйте вашу переменную как real :: myVar
, вы будете если компилятор задан по умолчанию для всех real
значений с двойной точностью, но изменение параметров компилятора или перемещение вашего кода на другую машину с разными размерами по умолчанию для real
и integer
переменных приведет к некоторым неприятным сюрпризам (например, ваш итеративный матричный решатель взрывается).
Fortran также включает в себя некоторые функции, которые помогут выбрать параметр KIND
, который вам нужен – SELECTED_INT_KIND
и SELECTED_REAL_KIND
– но если вы только учитесь, я бы не стал беспокоиться о тех, кто в данный момент.
Поскольку вы упомянули о том, что вы изучаете Fortran как часть classа, вы также должны увидеть этот вопрос на ресурсах Fortran и, возможно, взглянуть на справочные руководства из набора компиляторов, который вы используете (например, Portland Group или Intel) – это, как правило, в свободном доступе.
Просто расширяя другие (очень хорошие) ответы, особенно ответ Андрея Панькова :
KIND переменной – это целочисленная метка, которая сообщает компилятору, какой из поддерживаемых им видов он должен использовать.
В точку. Несмотря на то, что для всех числовых внутренних типов параметр KIND используется для указания « модели для представления и поведения чисел на процессоре » (слова из раздела 16.5 стандарта), что на практике означает их битовую модель, это не единственное, что может представить параметр KIND.
Параметр KIND для типа – это любое изменение в его характере, модели или поведении, которое доступно программисту для выбора во время компиляции. Например, для внутреннего символьного типа параметр вида представляет собой набор символов, доступных на процессоре (ASCII, UCS-4, …).
Вы даже можете определить свои собственные модели / варианты поведения для определенных типов Derived (начиная с Fortran 2003). Вы можете создать тип Transform Matrix и иметь версию с KIND = 2 для 2D-пространства (в котором базовый массив будет 3×3) и KIND = 3 для 3D-пространства (с базовым массивом 4×4). Просто помните, что автоматическое преобразование типов для неинтерминированных типов отсутствует.