Главная страница
Навигация по странице:

  • 3.3. Правила умолчания о типах данных

  • 3.5. Буквальные константы

  • современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран


    Скачать 2.24 Mb.
    НазваниеО. В. Бартеньев Современный Фортран
    Анкорсовременный фортран , Бортеньев.pdf
    Дата28.05.2018
    Размер2.24 Mb.
    Формат файлаpdf
    Имя файласовременный фортран , Бортеньев.pdf
    ТипДокументы
    #19729
    страница6 из 49
    1   2   3   4   5   6   7   8   9   ...   49
    49

    О. В. Бартеньев. Современный ФОРТРАН
    3.2. Операторы объявления типов данных
    3.2.1. Объявление данных целого типа
    Оператор
    INTEGER объявляет переменные, константы, функции целого типа. Объекты данных целого типа могут быть заданы как INTEGER, IN-
    TEGER(1), INTEGER(2) или INTEGER(4). Можно использовать и принятый в Фортране 77 синтаксис: INTEGER*1, INTEGER*2
    или
    INTEGER*4.
    Напомним, что указанные в скобках значения задают разновидность типа, значения после звездочки - число отводимых под тип байт. Задаваемую по умолчанию разновидность стандартного целого типа данных INTEGER можно изменить, используя опцию компилятора /4I2 или директиву $IN-
    TEGER:2.
    Синтаксис оператора INTEGER:
    INTEGER [[([KIND =] kind-value)][, attrs] ::] entity-list
    kind-value - значение параметра разновидности KIND. В качестве kind-
    value может быть использована ранее определенная именованная константа.
    attrs - один или более атрибутов, описывающих представленные в entity-list объекты данных. Если хотя бы один атрибут указан, то должен быть использован разделитель :: . Возможные атрибуты: ALLOCATABLE,
    AUNO-
    MATIC,
    DIMENSION(dim),
    EXTERNAL,
    INTENT,
    INTRINSIC,
    OPTIONAL,
    PARAMETER,
    POINTER,
    PRIVATE,
    PUBLIC,
    SAVE,
    STATIC,
    TARGET
    и
    VOLATILE (последний атрибут применим только в CVF).
    Задание атрибутов может быть также выполнено и отдельным оператором, имя которого совпадает с именем атрибута. Атрибуты определяют дополнительные свойства данных и будут вводиться по мере изложения материала. Если задан атрибут
    PARAMETER, то необходимо инициализирующее выражение, например: integer(4), parameter :: m= 10, n = 20
    entity-list - разделенный запятыми список имен объектов данных
    (переменных, констант, а также внешних, внутренних, операторных и встроенных функций), содержащий необязательные инициализирующие значения переменных выражения. При этом инициализация может быть выполнена двумя способами: integer :: a = 2, b = 4
    ! Наличие разделителя :: обязательно или integer a /2/, b /4/
    ! Разделитель :: может отсутствовать
    Если параметр KIND
    отсутствует, то применяемое по умолчанию значение разновидности равно четырем (если не использована опция компилятора /4I2 или директива
    $INTEGER:2). Значение параметра разновидности можно узнать, применив встроенную справочную функцию
    KIND (разд. 6.10).
    Диапазон изменения значений целых типов:
    50
    риложение3. Организация данных
    BYTE то же, что и INTEGER(1)
    INTEGER(1) от -128 до +127
    INTEGER(2) от -32,768 до +32,767
    INTEGER(4) от -2,147,483,648 до +2,147,483,647
    INTEGER то же, что и INTEGER(4)
    Пример: integer day, hour
    ! Объявление без атрибутов integer(2) k/5/, limit/45/
    ! Объявление и инициализация byte vmin = -1
    ! То же, что и INTEGER(1)
    !
    Объявления с атрибутами integer, allocatable, dimension(:) :: days, hours integer(kind = 2), target :: kt = 2
    ! Объявление и инициализация integer(2), pointer :: kp integer(1), dimension(7) :: val = 2
    ! Объявление и инициализация allocate(days(5), hours(24))
    ! Размещение массивов days = (/ 1, 3, 5, 7, 9/ )
    ! Генерация значений массивов hours = (/ (i, i = 1, 24) /)
    ! при помощи конструктора массива day = days(5) hour = hours(10) kp => kt
    ! Присоединение ссылки к адресату print *, day, hour print *, kt, kp print *, vmin, val(5), k*limit, kind(val), range(kp) end
    Результат:
    9 10 2 2
    -1 2 225 1 4
    Замечание. Пользуясь синтаксисом Фортрана 77, первые 3 оператора можно объединить, указав размер типа в байтах после имени переменной: integer day*4, hour*4, k*2 /5/, limit*2 /45/, vmin*1 /-1/
    Число, стоящее после звездочки (*), указывает на количество байт, отводимых под переменную заданного типа. Такой способ объявления данных возможен и с другими встроенными типами.
    Целая величина может быть в ряде случаев использована там, где ожидается логическое значение (в операторах и конструкциях IF и DO
    WHILE). При этом любое отличное от нуля целое интерпретируется как
    истина (.TRUE.), а равное нулю - как ложь (.FALSE.), например: integer(4) :: i, a(3) = (/ 1, -1, 0 /) do i = 1, 3 if(a(i)) then write(*, *) 'True'
    51

    О. В. Бартеньев. Современный ФОРТРАН
    else write(*, *) 'False' end if end do
    Результат:
    True
    True
    False
    Также целая величина может быть присвоена логической переменной: logical fl1, fl2 fl1 = 5; fl2 = 0 print *, fl1, fl2
    ! T F
    Замечание. Смешение логических и целых величин недопустимо, если используется опция компилятора /4Ys или директива $STRICT, при которой все расширения по отношению к стандарту Фортран 90 воспринимаются как ошибки.
    3.2.2. Объявление данных вещественного типа
    Синтаксис оператора объявления объектов вещественного типа аналогичен синтаксису оператора INTEGER:
    REAL [[([KIND =] kind-value)] [, attrs] ::] entity-list
    Параметр KIND может принимать значения 4 и 8. Первое значение используется для объявления объектов данных одинарной точности, а второе - для объектов двойной точности. Параметр разновидности может быть опущен. В таком случае принимаемое по умолчанию значение параметра разновидности вещественного типа равно четырем. Разумеется, возможно использование и альтернативного способа объявления данных, например вместо REAL(4) можно использовать REAL*4. Также вещественные данные двойной точности могут быть объявлены оператором
    DOUBLE PRECISION.
    Вещественные данные представляются в ЭВМ в виде чисел с плавающей точкой.
    Параметром разновидности может также быть именованная константа или возвращаемое функцией KIND значение. Так, объявление
    REAL(KIND(0.0)) эквивалентно объявлению REAL(4) или REAL(KIND = 4)
    (или REAL(8), если задана опция компилятора /4R8). Объявление
    REAL(KIND(0.0_8)) эквивалентно объявлению REAL(8) или
    REAL(KIND = 8). Задаваемая по умолчанию разновидность стандартного вещественного типа может быть изменена с 4 на 8 в результате использования опции компилятора /4R8
    или директивы $REAL:8.
    Диапазон изменения значений вещественных типов:
    REAL(4) отрицательные числа: от -3.4028235E+38 до -1.1754944E-38;
    52
    риложение3. Организация данных число 0; положительные числа: от +1.1754944E-38 до +3.4028235E+38; дробная часть может содержать до шести десятичных знаков.
    REAL то же, что и REAL(4)
    REAL(8) отрицательные числа: от -1.797693134862316D+308 до -2.225073858507201D-308; число 0; положительные числа: от +2.225073858507201D–308 до +1.797693134862316D+308; дробная часть может содержать до 15 десятичных знаков.
    Пример 1:
    integer(4), parameter :: m = 3, n = 5, low = 4 real(kind = 4) :: d(m, n) = 15.0, hot = 3.4 real(4), pointer :: da(:, :) real(low) d2(n)
    Пример 2. Атрибут может быть задан в виде оператора. real(8) :: da
    ! Объявляем ссылочный массив da pointer da
    ! Теперь, используя операторы, зададим атрибуты dimension da(:, :) parameter m = 10, n = 20 allocate(da(m, n))
    ! Первый исполняемый оператор
    3.2.3. Объявление данных комплексного типа
    Комплексное число типа COMPLEX или COMPLEX(4) представляет собой упорядоченную пару вещественных чисел одинарной точности.
    Комплексное число типа COMPLEX(8)
    (DOUBLE COMPLEX) - упорядоченная пара вещественных чисел двойной точности. Например: complex(4) :: c, z = (3.0, 4.0) c = z / 2
    ! (1.50000, 2.00000)
    Первый компонент пары представляет действительную, а второй - мнимую части числа. Оба компонента комплексного числа имеют одну и ту же разновидность типа.
    Синтаксис оператора объявления объектов комплексного типа:
    COMPLEX [([KIND =] kind-value)] [[, attrs] ::] entity-list
    3.2.4. Объявление данных логического типа
    Объекты логического типа объявляются оператором
    LOGICAL
    [([KIND =] kind-value)] [[, attrs] ::] entity-list
    Разновидность типа может принимать значения 1, 2 и 4 и совпадает с длиной логической величины в байтах. Задаваемую по умолчанию
    53

    О. В. Бартеньев. Современный ФОРТРАН
    разновидность стандартного логического типа данных LOGICAL можно изменить с 4 на 2, задав опцию компилятора /4I2 или директиву
    $INTEGER:2.
    Пример:
    logical, allocatable :: flag1(:), flag2(:) logical(2), save :: doit, dont = .false._2 logical switch
    ! Эквивалентное объявление с использованием операторов вместо атрибутов logical flag1, flag2 logical(2) :: doit, dont = .false._2 allocatable flag1(:), flag2(:) save doit, dont
    Логические величины (переменные, выражения) могут быть использованы в арифметических операторах и могут быть присвоены целым переменным.
    Пример:
    integer :: a = 2 logical :: fl = .true., g = .false. write(*, *) a * fl, a * g
    !
    2 0 end
    Правда, там, где требуются арифметические величины, например в спецификаторе UNIT оператора OPEN, применение логических величин недопустимо. Смешение логических и целых величин также недопустимо, если используется опция компилятора /4Ys.
    3.3. Правила умолчания о типах данных
    В Фортране допускается не объявлять объекты данных целого и вещественного типов. При этом тип данных объекта будет установлен в соответствии с существующими правилами умолчания: объекты данных, имена которых начинаются с букв i, j, k, l, m и n или с букв I, J, K, L, M и N, имеют по умолчанию стандартный целый тип (INTEGER); все остальные объекты имеют по умолчанию стандартный вещественный тип (REAL).
    Заметим, что на часть встроенных функций это правило не распространяется. Задаваемую по умолчанию разновидность типа данных можно изменить, задав для целого типа при компиляции опцию /4I2 или директиву $INTEGER:2 и для вещественного типа - опцию компилятора
    /4R8 или директиву $REAL:8 [1].
    Пример:
    integer :: x = 5
    ! Целочисленная переменная y = 2 * x
    ! y - переменная типа REAL
    54
    риложение3. Организация данных
    3.4. Изменение правил умолчания
    Изменение правил умолчания о типах объектов данных выполняется оператором IMPLICIT, который задает для объявленного пользователем имени принимаемый по умолчанию тип.
    Синтаксис оператора:
    IMPLICIT NONE или
    IMPLICIT type(letters) [, type(letters), ...]
    type - один из встроенных или производных типов данных.
    letters - список одинарных букв или диапазонов букв. Диапазон букв задается первой и последней буквой диапазона, разделенными знаком тире, например c - f. Буквы и диапазоны букв в списке разделяются запятыми, например:
    implicit integer(4) (a, c - f), character(10) (n)
    После такого задания все объекты данных, имена которых начинаются с букв a и A и с букв из диапазона c - f и C - F, будут по умолчанию иметь тип INTEGER(4), а объекты, имена которых начинаются с букв n и N, по умолчанию будут иметь тип CHARACTER(10).
    Задание одной и той же буквы в операторе (непосредственно или через диапазон) недопустимо. Диапазон букв должен быть задан в алфавитном порядке. Знак доллара ($), который может использоваться в качестве первой буквы имени, следует в алфавите за буквой Z.
    Оператор не меняет типа встроенных функций.
    Явное задание типа имеет более высокий приоритет, чем тип, указываемый оператором IMPLICIT. Задание
    IMPLICIT NONE означает, что все используемые в программе имена должны быть введены явно (через операторы объявления типов данных). Невведенные имена приводят к возникновению ошибки на этапе компиляции. Никакие другие операторы IMPLICIT не могут указываться в программной единице, содержащей оператор IMPLICIT NONE. Ясно, что задание IMPLICITNONE позволяет полностью контролировать типы всех объектов данных.
    Пример: implicit integer(a - b), character(len = 10) (n), type(feg)(c - d) type feg integer e, f real g, h end type age = 10
    ! age - переменная типа INTEGER name = 'Peter'
    ! name - переменная типа CHARACTER(10)
    55

    О. В. Бартеньев. Современный ФОРТРАН
    c%e = 1
    ! c%e - целочисленный компонент типа feg
    $j = 5.0
    ! $j - Переменная типа REAL
    3.5. Буквальные константы
    В Фортране различают именованные и буквальные константы.
    Буквальные константы (далее - просто константы) используются в выражениях и операторах Фортрана. Возможно задание арифметических,
    логических и символьных буквальных констант.
    3.5.1. Целые константы
    Целые константы в десятичной системе счисления- целые числа
    (со знаком или без знака), например:
    +2 2 -2
    Константа может быть задана с указанием разновидности типа, значение которой указывается после значения константы и символа _ , например: integer i*2, j*1 integer, parameter :: is = 1 i = -123_2
    ! Разновидность типа KIND = 2 j = +123_is
    ! Разновидность типа KIND = 1 write(*, *) i, j, kind(123_is)
    ! -123 123 1
    Для указания разновидности может быть использована ранее определенная именованная константа (в примере is) стандартного целого типа.
    Целые константы по произвольному основаниюзадаются так:
    [знак] [[основание] #] константа [_kind]
    Знак это + или -. Для положительных констант знак может быть опущен.
    Основание может быть любым целым числом в диапазоне от 2 до 36. Если основание опущено, но указан символ #, то целое интерпретируется как число, заданное в шестнадцатеричной системе счисления. Если опущены и основание и символ #, то целое интерпретируется как имеющее основание 10. В системах счисления с основаниями от 11 до 36 числа с основанием 10, значения которых больше девяти, представляются буквами от A до Z. Регистр букв не является значащим. Константа может быть задана с указанием разновидности типа.
    Пример. Представить десятичную константу 12 типа INTEGER(1) в системах счисления с основаниями 2, 10 и 16.
    2#1100_1 12_1 или 10#12_1#C_1 или 16#C_1
    По умолчанию буквальные целые константы имеют стандартный целый тип.
    Помимо названных возможностей, в операторе DATA беззнаковые целые константы могут быть представлены в двоичной, восьмеричной
    56
    риложение3. Организация данных или шестнадцатеричной форме с указанием системы счисления в виде символа, предшествующего значению константы (соответственно B или b,
    O или o, Z или z для двоичной, восьмеричной или шестнадцатеричной систем счисления). Сама же константа обрамляется апострофами (') или двойными кавычками. При этом константа должна использоваться для инициализации целой скалярной переменной. integer i, j, k data i /b'110010'/
    ! Двоичное представление десятичного числа 50 data j /o'62'/
    ! Восьмеричное представление числа 50 data k /z'32'/
    ! Шестнадцатеричное представление числа 50
    3.5.2. Вещественные константы
    Вещественные константы используются для записи действительных чисел. Вещественные константы одинарной REAL(4) и двойной REAL(8) точности могут быть представлены в F-форме или в Е-форме. Помимо этого, вещественные константы двойной точности могут быть представлены и в D-форме. Память, занимаемая вещественной константой одинарной точности, равна 4 байтам, а двойной точности - 8 байтам.
    Вещественные константы в F-форме записываются в виде:
    [+]|- [целая часть] . [дробная часть] [_разновидность типа]
    Целая или дробная часть в F-форме может быть опущена, но не обе одновременно.
    Пример:
    +2.2 2.2_4 2.0_8 2. -0.02_knd -.02
    Замечание. knd - ранее определенная константа стандартного целого типа
    (knd = 4 или knd = 8).
    Константы в Е-форме и D-форме имеют вид:
    [+]|- [мантисса] E | e [+]|- порядок [_разновидность типа]
    [+]|- [мантисса] D | d [+]|- порядок
    Мантисса - число в F-форме или целое число.
    Порядок - однозначное или двузначное целое положительное число.
    Пример 1:
    Е- и D-формы числа 18.2*10 11
    : +18.2E11 18.2e+11_8 18.2D11
    Е- и D-формы числа -0.18*10
    -5
    : -.18E-05 -.18e-5 -.18d-5
    Пример 2:
    real(8) :: a*4 = +18.2E11, b = 18.2e+11_8, c /18.2D11/
    ! a - переменная одинарной, b и c - двойной точности print *, a, b, c
    57

    О. В. Бартеньев. Современный ФОРТРАН
    Результат:
    1.820000E+12 1.820000000000000E+012 1.820000000000000E+012
    Е- и D-формы также называются экспоненциальными формами числа и хороши для представления больших и малых чисел.
    Вещественные константы одинарной точности могут представлять числа в диапазоне изменения значений типа REAL(4) (разд. 3.2.2). Дробная часть может содержать до шести десятичных знаков.
    Вещественные константы двойной точности могут представлять числа в диапазоне изменения значений типа REAL(8) (разд. 3.2.2). Дробная часть может содержать до 15 десятичных знаков.
    3.5.3. Комплексные константы
    Комплексные
    константы используются для представления комплексных чисел и имеют вид:
    [знак](действительная часть[_разновидность], &
    мнимая часть[_разновидность])
    Если знак задан, то он применяется как для действительной, так и для мнимой части. Задание общего знака при инициализации комплексной переменной в операторах DATA и объявлениях типов недопустимо.
    Действительная (мнимая) часть - целая или вещественная константы.
    Буквальные комплексные константы могут быть одинарной
    COMPLEX(4) и двойной COMPLEX(8) точности. В комплексных константах одинарной точности мнимая и действительная части занимают по 4 байта памяти; в комплексных константах двойной точности - по 8 байт.
    Поэтому комплексная константа одинарной точности занимает 8 байт памяти, а двойной - 16. При задании компонентов комплексной константы можно использовать одновременно для действительного и мнимого компонента константы Е-, D- и F-формы. В случае одновременного использования одинарной и двойной точности при задании комплексной константы компилятор выполнит преобразование типов в соответствии с рангом типов арифметических операндов: комплексная константа будет иметь двойную точность, а компонент одинарной точности будет преобразован в форму с двойной точностью.
    Пример 1. Число 36.8 - 263.3i в виде комплексной константы:
    (36.8, -2.633E2) или
    (36.8, -263.3) или
    (36.8_4, -2.633E2_4)
    1   2   3   4   5   6   7   8   9   ...   49


    написать администратору сайта