Фортран 90 добрый параметр

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

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

6 ответов

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

Помните, что хотя параметр KIND обычно совпадает с количеством байтов, хранящихся в переменной этого KIND, это не требуется стандартом Фортрана.

То есть на многих системах

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 и т. д. стиль объявления.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      integer, parameter :: r8=selected_real_kind(15,9) 
real(kind=r8) :: a

Теперь эта переменная a всегда имеет тип r8, который является реальным 8 (означает, что использует 8 байтов) типом, независимо от того, на какой машине / ОС она запущена.

Кроме того, вы можете писать такие вещи, как,

      a = 1.0_r8

и этот _r8 убедитесь, что 1.0 является типом r8.

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

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

Другие вопросы по тегам