Фортран 90 добрый параметр - PullRequest
33 голосов
/ 08 мая 2009

У меня проблемы с пониманием параметра kind Фортрана 90-х годов. Насколько я могу судить, он не определяет точность (т.е. с плавающей или двойной) переменной, а также не определяет тип переменной.

Итак, что это определяет и для чего именно?

Ответы [ 5 ]

50 голосов
/ 13 мая 2009

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. kind. Наиболее информированное обсуждение Фортрана происходит там, где некоторые высококвалифицированные люди вносят свой вклад.)

Итак, если вы не можете рассчитывать на конкретное значение типа, обеспечивающее одинаковое представление данных на разных платформах, что вы делаете? Вот для чего нужны встроенные функции 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*8 и т. Д.

Когда вы начинаете с новым компилятором, стоит взглянуть на значения определенного типа, чтобы вы знали, с чем имеете дело. Найдите в сети kindfinder.f90 удобную программу, которая расскажет вам о доступных для компилятора видах.

6 голосов
/ 26 мая 2015

Я предлагаю использовать Фортран 2008 и позже; INT8, INT16, INT32, INT64, REAL32, REAL64, REAL128. Это делается путем вызова ISO_FORTRAN_ENV в Fortran 2003 и более поздних версиях. Kind-параметры предоставляют непоследовательный способ гарантировать, что вы всегда получаете соответствующее количество битовых представлений

2 голосов
/ 24 мая 2018

Просто расширяю другие (очень хорошие) ответы, особенно Андрей Паньков :

KIND переменной является целочисленной меткой, которая сообщает компилятору какой из поддерживаемых видов он должен использовать.

Точно. Несмотря на то, что для всех числовых внутренних типов параметр KIND используется для указания " модели для представления и поведения чисел на процессоре " (слова из раздела 16.5 стандарт), что на практике означает их битовую модель, это не единственное, что может представлять параметр KIND.

Параметром KIND для типа является любое изменение по своей природе, модели или поведению, которое программист может выбрать во время компиляции. Например, для внутреннего типа символов параметр kind представляет наборы символов, доступные на процессоре (ASCII, UCS-4, ...).

Вы даже можете определить свои собственные вариации модели / поведения для определенных вами производных типов (начиная с Fortran 2003 и далее). Вы можете создать тип матрицы преобразования и иметь версию с KIND = 2 для 2D-пространства (в котором базовый массив будет 3x3) и KIND = 3 для 3D-пространства (с базовым массивом 4x4). Просто помните, что нет автоматического преобразования типов для не внутренних типов.

1 голос
/ 09 мая 2009

Из Portland Group Fortran Reference параметр KIND "определяет точность для внутренних типов данных". Таким образом, в декларации

real(kind=4) :: float32
real(kind=8) :: float64

переменная float64 объявлена ​​как 8-байтовое вещественное число (старый Fortran DOUBLE PRECISION), а переменная float32 объявлена ​​как 4-байтовое вещественное число (старый Fortran REAL).

Это хорошо, потому что это позволяет вам фиксировать точность переменных независимо от компилятора и машины, на которой вы работаете. Если вы выполняете вычисление, которое требует большей точности, чем традиционное действительное значение IEEE с одинарной точностью (которое, если вы берете класс числового анализа, очень вероятно), но объявите свою переменную как real :: myVar, вы будете хорошо, если для компилятора по умолчанию все значения real установлены с двойной точностью, но изменение параметров компилятора или перемещение вашего кода на другой компьютер с разными размерами по умолчанию для переменных real и integer приведет к некоторым, возможно, неприятным последствиям. сюрпризы (например, ваш итеративный матричный решатель взрывается).

Fortran также включает в себя некоторые функции, которые помогут выбрать параметр KIND, который будет вам нужен - SELECTED_INT_KIND и SELECTED_REAL_KIND - но если вы только учитесь, я бы не стал беспокоиться об этом на данном этапе.

Поскольку вы упомянули, что изучаете Фортран как часть класса, вы также должны увидеть этот вопрос на ресурсах Фортрана и, возможно, взглянуть на справочные руководства из набора используемых вами компиляторов (например, Portland Group или Intel) - они обычно находятся в свободном доступе.

0 голосов
/ 23 мая 2019

Подводя итог другим ответам: параметр типа указывает размер хранилища (и, следовательно, косвенно, точность) для внутренних типов данных, таких как целые и вещественные.

Однако, рекомендуемый способ - НЕ указывать значение типа переменных в исходном коде, вместо этого используйте параметры компилятора, чтобы указать желаемую точность. Например, мы пишем код: real :: abc, а затем компилируем код, используя опцию компиляции -fdefault-real-8 (для gfortran), чтобы указать число с плавающей запятой в 8 байтов. Для ifort соответствующая опция: -r8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...