Материал: Аверянов Введение в оператсионные системы и основы программирования 2015

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Для двух последних буквальных констант явно указаны значения параметра разновидности типа (п. 3.3.4).

Буквальные константы комплексного типа (COMPLEX)

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

(1.23, 4.56) (7.8, 90) (–98.7E+21, 1.23) (+0, 1.25E–34)

Наличие встроенного комплексного типа является одним из преимуществ Фортрана, как языка предназначенного для научных и инженерных расчетов.

Буквальные константы логического типа (LOGICAL) в

Фортране 90/95 присутствуют всего в двух вариантах:

.TRUE. .FALSE.

Обрамляющие точки в записи констант .TRUE. (ИСТИНА) и

.FALSE. (ЛОЖЬ) являются обязательными элементами. Некоторые компиляторы Фортрана 77 и 90/95 поддерживают также константы

.T. и .F. (опять-таки с обязательными обрамляющими точками).

Буквальные константы текстового или символьного типа

(CHARACTER) – последовательности символов, заключенные либо в одиночные апострофы, либо в кавычки:

'HELLO, WORLD' или ″HELLO, WORLD″

Если текстовая константа содержит элемент, заключенный в кавычки, то внутренние кавычки необходимо сдвоить, например:

″The book ″″War and Peace″″ of Leo Tolstoy″. То же самое можно отнести и к апострофам. Чтобы избежать такого сдваивания, нужно заключать константу в апострофы, если внутренний текст содер-

жит кавычки: 'The book "War and Peace" of Leo Tolstoy', и заключать константу в кавычки, если текст содержит апострофы.

Для типа данных CHARACTER символьная длина текстовой константы характеризуется спецификатором LEN. Для буквальной

141

константы ″HELLO, WORLD″ значение спецификатора LEN=12 (с учетом одного пробела после запятой в тексте константы).

3.3.4. Разновидности типов и диапазоны значений

Очевидно, что для объекта данных любого типа выделяется некоторая память (в машинных словах или байтах). Иногда эта память может оказаться избыточной (если например, для целых чисел в диапазоне ±127 отводится по два или четыре байта, тогда как вполне достаточно одного байта). Это может иметь серьезное значение при обработке больших массивов данных, характерных для математических моделей сложных физических процессов и технических систем.

Идея разновидности типа заключается в том, чтобы обеспечить требуемый диапазон значений данных с максимальной экономией памяти, независимо от применяемого компьютера и операционной системы. Таким образом, нужно определить минимальное количество байтов, необходимых для хранения данных, эта величина в Фортране 90/95 имеет название параметра разновидности типа и

обозначение KIND.

Значение параметра разновидности KIND можно вычислить заранее (до программирования) или использовать специальные функции Фортрана. Предположим, требуется обеспечить работу с целыми числами в диапазоне от – 9999 до 9999 (т.е. работу с целыми величинами в пределах четырех значащих цифр). В этом случае значение параметра разновидности можно получить с помощью специальной встроенной функции SELECTED_INT_KIND, аргументом функции будет количество значащих цифр (пример 3.21).

Пример 3.21. Определение параметра KIND через буквальную константу program INT4KIND

print*, SELECTED_INT_KIND(4) end

В примере 3.22 значение функции SELECTED_INT_KIND(4)

присваивается константе с именем K4 (может быть любое другое имя), затем объявляются целые переменные X, Y и Z с параметром разновидности KIND=K4. Переменные инициализируются целыми

142

буквальными константами соответствующей разновидности целого типа (см. также п. 3.3.5).

Пример 3.22. Определение параметра KIND через SELECTED_INT_KIND program INT4KIND

integer(kind=1), parameter :: K4=SELECTED_INT_KIND(4) integer(kind=K4) :: X=1235_K4, Y=4678_K4, Z=90_K4 print*, K4, X, Y, Z

end

Для определения параметра разновидности вещественных значений используется функция SELECTED_REAL_KIND (пример 3.23). Если требуется точность не менее девяти значащих цифр (первый аргумент) и степенной диапазон в пределах от 1.E–99 до 1.E+99 (второй аргумент), то значение KIND можно вычислить, указав соответствующие аргументы: SELECTED_REAL_KIND(9, 99).

Пример 3.23. Определение параметра KIND через SELECTED_REAL_KIND

program REALONG

integer(kind=1), parameter :: LONG=SELECTED_REAL_KIND(9,99) real(kind=LONG) :: X=1.234567895E+98_LONG

print*, LONG, X end

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

Для определения модуля максимального значения данной разновидности целого типа, например KIND=8, можно воспользоваться встроенной функцией HUGE (пример 3.24).

Пример 3.24. Максимальное значение для 8-байтовых INTEGER program MAXINT8

integer (kind=8) X print *, huge(X) end

Для определения модуля максимального значения данной разновидности вещественного типа, например, KIND=16, также мож-

143

но воспользоваться встроенной функцией HUGE, а для определения границ машинного нуля – функцией TINY (пример 3.25).

Пример 3.25. Диапазон значений и машинный ноль 16-байтовых REAL program MAXMINREAL16

real (kind=16) X

print *, huge(X), tiny(X) end

Компилятор Gfortran предусматривает для данных встроенных типов следующие значения параметра разновидности типа.

Для целых чисел (INTEGER):

KIND=1 (однобайтные целые) в пределах: ±127;

KIND=2 (двухбайтные целые) в пределах: ±32767; KIND=4 (двухбайтные целые) в пределах: ±2147483647; KIND=8 (восьмибайтные целые): ±9223372036854775807_8.

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

Для данных вещественного типа REAL:

KIND=4 (четырехбайтные REAL) в пределах: ± 3.40282347E+38, где границы машинного нуля: ±1.17549435E–38;

KIND=8 в пределах: ±1.79769313486231571E+308_8, где границы машинного нуля: ±2.22507385850720138E–308_8;

KIND=16 имеют значения в пределах:

±1.18973149535723176508575932662800702E+4932_16,

при этом границы машинного нуля:

± 3.36210314311209350626267781732175260E-4932_16.

Стандартной разновидностью вещественного типа, по умолчанию, считается KIND=4.

Константа, для которой KIND=4 или параметр разновидности не задан, имеет точность до 7 значащих цифр.

144

Для комплексных буквальных констант (COMPLEX)

Разновидность типа определяется в соответствии со следующими правилами.

Если вещественная и мнимая части комплексного числа заданы целыми числами, то разновидность комплексной константы совпадает со стандартной разновидностью вещественных чисел. Для компилятора Gfortran это означает KIND=4.

Если имеет место комбинация целого и вещественного числа, то разновидность комплексной константы совпадает с разновидностью вещественного числа.

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

Компилятор Gfortran работает со следующими разновидностями

логических буквальных констант (LOGICAL):

KIND=1 – байт, содержащий либо 0 (.FALSE.), либо 1 (.TRUE.); KIND=2 – двухбайтовый объект логического типа (старший

байт соответствует KIND=1, второй содержит значение NULL); KIND=4 – четырехбайтовый объект логического типа (старший

(первый) байт в точности аналогичен KIND=1, остальные содержат значение NULL).

Для символьных (текстовых) данных (CHARACTER) пара-

метр разновидности KIND типа применяется для указания кодовой таблицы символов, например: ASCII, UTF, Windows-1251и т.д. Оптимальная кодовая таблица всегда задана операционной системой, поэтому параметр KIND лучше не использовать без крайней необходимости. Более детально работа с текстовыми строками рассмот-

рена в п. 3.4.4.

Правильное (или неправильное) представление буквальных констант может серьезно и даже критично отражаться на точности вычислений. Если, например, для каких-то вычислений потребовалось число с точностью до 15-ти значащих цифр, то недостаточно объявить соответствующую вещественную переменную или константу как real (KIND=8). Не менее важно правильно инициализи-

145

Источник: https://studfile.net/preview/16708824/