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