Подтвердить что ты не робот

Параметр вида Fortran 90

Мне сложно понять параметр Fortran 90 kind. Насколько я могу судить, он не определяет точность (т.е. Float или double) переменной и не определяет тип переменной.

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

4b9b3361

Ответ 1

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, чтобы найти примеры. Наиболее информированное обсуждение 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*8 etc.

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

В 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 - но если вы просто учитесь, я бы не стал беспокоиться о тех, кто в данный момент.

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

Ответ 5

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

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