современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран
Скачать 2.24 Mb.
|
170 5. Выражения, операции и присваивание end subroutine charti end interface integer k, m character(80) :: st = 'String to count' k = st(:10) ! Выполняется заданное присваивание call charti(m, st(:10)) ! Этот вызов эквивалентен оператору m = st(:10) print *, k, m ! 890 890 end subroutine charti(n, ch) integer, intent (out) :: n character(*), intent (in) :: ch integer i n = 0 do i = 1, len_trim(ch) n = n + ichar(ch(i:i)) end do end subroutine charti Замечание. Реализующая присваивание подпрограмма может быть модульной процедурой (разд. 8.7). Более подробно вопросы перегрузки присваивания рассмотрены в разд. 8.12.2. 171 6. Встроенные процедуры 6.1. Виды встроенных процедур Встроенные процедуры разделяются на 4 вида: 1) элементные процедуры. Параметрами таких процедур могут быть как скаляры, так и согласованные массивы. Когда параметрами являются массивы, каждый элемент результирующего массива равен результату применения процедуры к соответствующим элементам массивов- параметров. Среди элементных процедур есть одна подпрограмма - MVBITS. Остальные являются функциями. Результирующий массив должен быть согласован с массивами-параметрами; 2) справочные функции выдают информацию о свойствах параметров функций. Результат справочной функции не зависит от значения параметра, который, в частности, может быть и неопределенным; 3) преобразовывающие функции; 4) неэлементные подпрограммы. Помимо встроенных CVF и FPS имеют большое число дополнительных процедур, перечень которых приведен в прил. 3. 6.2. Обращение с ключевыми словами Поскольку встроенные процедуры обладают явно заданным интерфейсом, их вызов может быть выполнен с ключевыми словами. Например: pi = asin(x = 1.0) ! x - ключевое слово y = sin(x = pi) В качестве ключевых слов используются имена формальных параметров. Эти имена приводятся при описании каждой встроенной процедуры. Необходимость в таких вызовах возникает лишь при работе с процедурами, которые имеют необязательные параметры, и в том случае, когда изменяется естественный порядок следования параметров. Иногда применение ключевых слов делает вызов более наглядным. Пример. Функция MAXVAL(array [, dim] [, mask]) поиска максимальных значений в массиве имеет два необязательных параметра dim и mask. integer array(2, 3) array = reshape((/1, 4, 5, 2, 3, 6/), (/2, 3/)) ! Массив array: 1 5 3 ! 4 2 6 ! Естественный порядок параметров. Вызов без ключевых слов print 1, maxval(array, 1, array < 4) ! 1 2 3 print 1, maxval(array, 1) ! 4 5 6 ! Вызов с ключевыми словами; однако поскольку порядок параметров 172 6. Встроенные процедуры ! не нарушен, применение ключевых слов необязательно print 1, maxval(array, dim = 1, mask = array < 4) ! 1 2 3 print 1, maxval(array, dim = 1) ! 4 5 6 ! Применение ключевых слов обязательно print 1, maxval(array, mask = array < 4, dim = 1) ! 1 2 3 print 1, maxval(array, mask = array < 4) ! 3 1 format(3i3) end 6.3. Родовые и специфические имена Имена многих встроенных процедур являются родовыми. Например, родовым является имя функции MAXVAL из только что приведенного примера. На практике это означает, что тип результата такой функции зависит от типа обязательного параметра. Так, функция может принимать в качестве параметра array массив любого целого или вещественного типа. Тип и значение параметра разновидности типа результата функции MAX- VAL такие же, как у параметра array. Родовые имена встроенных функций не могут быть использованы в качестве фактических параметров процедур (разд. 8.18.2). Ряд встроенных функций имеют специфические имена, и их вызов может быть выполнен как по родовому, так и по специфическому имени. Вызов с родовым именем и параметром типа type эквивалентен вызову со специфическим именем с тем же типом параметра. Пример: real(4) :: x = 3.0 real(8) :: y = 3.0 ! LOG - родовое имя complex(4) :: z = (3.0, 4.0) ! CLOG - специфическое имя print *, log(x) ! 1.098612 print *, log(y) ! 1.098612288668110 print *, log(z) ! (1.609438, 9.272952E-01) print *, clog(z) ! (1.609438, 9.272952E-01) Замечание. Вызов функции LOG с целочисленным параметром недопустим, поскольку в противном случае не было бы ясности, в какой допустимый тип (вещественный или комплексный) следует автоматически преобразовать целочисленный аргумент. То же справедливо и для других математических функций. Специфические имена функций могут быть использованы в качестве параметров процедур (см. табл. 8.3 в разд. 8.18.2) за исключением имен, указанных в табл. 8.4. Специфические имена применяют также, когда необходимо сделать очевидным для программиста используемый в расчетах тип данных. 173 О. В. Бартеньев. Современный ФОРТРАН В последующем описании встроенных процедур будут упоминаться только их родовые имена. Для справок относительно их специфических имен мы вновь отсылаем к табл. 8.3 и 8.4 в разд. 8.18.2. 6.4. Возвращаемое функцией значение Ряд функций, например RANGE или INDEX, возвращают значение стандартного целого типа (INTEGER). По умолчанию этот тип эквивалентен типу INTEGER(4). Однако если применена опция компилятора /4I2 или директива $INTEGER:2, то возвращаемый функцией результат имеет тип INTEGER(2). При этом также меняется устанавливаемый по умолчанию тип логических данных, т. е. функция стандартного логического типа, например ASSOCIATED, будет возвращать результат типа LOGICAL(2), а не LOGICAL(4). То же справедливо и для функций, возвращающих значение стандартного вещественного типа, который по умолчанию эквивалентен REAL(4). Однако если пользователем задана опция компилятора /4R8 или директива $REAL:8, то возвращаемый функцией результат имеет тип REAL(8). 6.5. Элементные функции преобразования типов данных В выражениях Фортрана можно использовать операнды разных типов. При вычислениях типы данных будут преобразовываться в соответствии с рангом типов операндов. Однако часто требуется явное преобразование типов, например чтобы избежать целочисленного деления или правильно обратиться к функции. Для подобных целей используются функции преобразования типов данных. Например: integer :: a = 2, b = 3 print *, sin(float(a + b)) ! -9.589243E-01 AIMAG(z) - возвращает мнимую часть комплексного аргумента z. Результат имеет вещественный тип с параметром разновидности, таким же, как и у z. INT(a [, kind]) - преобразовывает параметр a в целый тип с параметром разновидности kind путем отсечения значения a в сторону нуля. Тип параметра a - целый, вещественный или комплексный. Если параметр a комплексного типа, то действительная часть преобразовывается в целый тип путем отсечения в сторону нуля. Если параметр kind отсутствует, то результат имеет стандартный целый тип. Тип kind - INTEGER. Аналогичные преобразования, но с фиксированным типом результата выполняются следующими функциями: Функция Типы параметра Тип результата INT1(a) Целый, вещественный или комплексный INTEGER(1) 174 6. Встроенные процедуры INT2(a) " " " " INTEGER(2) INT4(a) Целый, вещественный или комплексный INTEGER(4) HFIX(a) " " " " INTEGER(2) JFIX(a) " " " " INTEGER(4) IZEXT(a), JZEXT(a) и ZEXT(a) - преобразовывают логические и целые значения в целый тип с большим значением параметра разновидности. Преобразование выполняется путем добавления нулей в свежие биты результата: Функции Типы параметра Тип результата IZEXT(a) LOGICAL(1), LOGICAL(2), BYTE, INTEGER(1), INTEGER(2) INTEGER(2) JZEXT(a) и ZEXT(a) LOGICAL(1), LOGICAL(2), LOGICAL(4), BYTE, INTEGER(1), INTEGER(2), INTEGER(4) INTEGER(4) REAL(a [, kind]) - преобразовывает параметр a в вещественный тип с параметром разновидности kind. Тип параметра a - целый, вещественный или комплексный. Если параметр kind отсутствует, то результат имеет стандартный вещественный тип. Если параметр a комплексного типа, то результат вещественный с параметром разновидности типа kind, если kind задан, и с тем же параметром разновидности типа, что и a, если kind опущен. DBLE(a) и DFLOAT(a) - преобразовывают целый, вещественный или комплексный параметр a в вещественный тип REAL(8). CMPLX(x [, y] [, kind]) - преобразовывает целые, вещественные или комплексные параметры в комплексный тип с параметром разновидности kind. Если параметр kind опущен, то результат COMPLEX(4). Если y задан, то x - вещественная часть комплексного результата. Параметр y не может быть задан, если x комплексного типа. Если y задан, то он является мнимой частью комплексного результата. Если x и y являются массивами, то они должны быть согласованными. Пример: complex z1, z2 complex(8) z3 z1 = cmplx(3) ! Возвращает 3.0 + 0.0i z2 = cmplx(3, 4) ! Возвращает 3.0 + 4.0i z3 = cmplx(3, 4, 8) ! Возвращает число типа COMPLEX(8) 3.0d0 + 4.0d0i DCMPLX(x [, y]) - выполняет те же преобразования, что и функция CMPLX, но тип результата всегда COMPLEX(8). Тип параметров x и y - целый, вещественный или комплексный. 175 О. В. Бартеньев. Современный ФОРТРАН LOGICAL(L [, kind]) - преобразовывает логическую величину из одной разновидности в другую. Результат имеет такое же значение, что и L и параметр разновидности kind. Если kind отсутствует, то тип результата LOGICAL. TRANSFER(source, mold [, size]) - переводит данные source в другой тип без изменения физического представления данных, т. е. значения отдельных битов результата и source совпадают. Тип и параметры типа результата такие же, как у mold. Пусть физическое представление source есть последовательность n бит b 1 b 2 b n , а представление mold занимает m бит, тогда результат: при n = m равен b 1 b 2 b n ; при n < m - b 1 b 2 b n s 1 s 2 s m - n , где биты s i не определены; при n > m - b 1 b 2 b m Если mold скаляр и параметр size опущен, то результат является скаляром. Если mold массив и size опущен, то результатом является одномерный массив, размер которого достаточен для размещения в нем source. Если параметр size задан, то результатом является одномерный массив размером size. Ниже даны элементные функции преобразования символа в его целочисленное представление и функции обратного преобразования, возвращающие символ по его коду. Описание функций приведено в разд. 3.8.8. Функция Тип параметра Тип результата ICHAR(c) CHARACTER(1) INTEGER(4) IACHAR(c) " " CHAR(i [, kind]) Целый CHARACTER(1) ACHAR(i) " " 6.6. Элементные числовые функции ABS(a) - абсолютная величина целого, вещественного или комплексного аргумента. Если a целого типа, то и результат целого типа, в остальных случаях результат будет вещественным. Для комплексного аргумента a = x + y i: ABS(a) = SQRT(x**2 + y**2). Пример: complex(4) :: z =(3.0, 4.0) write(*, *) abs(z) ! 5.0 (тип результата - REAL(4)) AINT(a [, kind]) - обрезает вещественную величину a в сторону нуля до целого числа и выдает результат в виде вещественной величины, разновидность типа которой совпадает со значением аргумента kind, если 176 6. Встроенные процедуры он задан, или - в противном случае - со стандартной разновидностью вещественного типа. ANINT(a [, kind]) - возвращает в виде вещественной величины целое число, ближайшее к значению вещественного аргумента a (выполняет округление a). Разновидность типа результата совпадает со значением аргумента kind, если он задан, или - в противном случае - со стандартной разновидностью вещественного типа. NINT(a [, kind]) - возвращает целое число, ближайшее к значению вещественного аргумента a (выполняет округление a). Разновидность типа результата совпадает со значением аргумента kind, если он задан, или - в противном случае - со стандартной разновидностью целого типа. Пример: real :: a(3) = (/ 2.8, -2.8, 1.3 /) write(*, *) anint(a) ! 3.000000 -3.000000 1.000000 write(*, *) nint(2.8), nint(2.2) ! 3 2 write(*, *) nint(a(2)), nint(-2.2) ! -3 -2 write(*, *) aint(2.6), aint(-2.6) ! 2.000000 -2.000000 CEILING(a [, kind]) - возвращает наименьшее целое, большее или равное значению вещественного аргумента a. Разновидность типа результата совпадает со значением аргумента kind, если он задан, или - в противном случае - со стандартной разновидностью целого типа. Необязательный параметр добавлен стандартом 1995 г. CONJG(z) - возвращает комплексное число, сопряженное со значением комплексного аргумента z. Пример: print *, conjg((3.0, 5.6)) ! (3.000000, -5.600000) DIM(x, y) - возвращает x - y, если x > y, и 0, если x ≤ y. Аргументы x и y должны быть оба целого или вещественного типа. Пример: print *, dim(6, 4), dim(4.0, 6.0) ! 2 0.000000E+00 DPROD(x, y) - возвращает произведение двойной точности - REAL(8). Аргументы x и y должны быть стандартного вещественного типа. Пример: real :: a = 3.72382, b = 2.39265 write(*, *) a * b, dprod(a, b) ! Результат: 8.9097980 8.90979744044290 FLOOR(a [, kind]) - возвращает наибольшее целое, меньшее или равное значению вещественного аргумента a. Разновидность типа результата совпадает со значением аргумента kind, если он задан, или - в противном 177 О. В. Бартеньев. Современный ФОРТРАН случае - со стандартной разновидностью целого типа. Необязательный параметр добавлен стандартом 1995 г. Пример для CEILING и FLOOR: integer i, iarray(2) i = ceiling(8.01) ! Возвращает 9 i = ceiling(-8.01) ! Возвращает -8 iarray = ceiling((/8.01, -5.6/)) ! Возвращает (9, -5) i = floor(8.01) ! Возвращает 8 i = floor(-8.01) ! Возвращает -9 iarray = floor((/ 8.01, -5.6 /), kind = 2) ! Возвращает (8, -6) типа INTEGER(2) MOD(a, p) - возвращает остаток от деления a на p, т. е. MOD(a, p) = a - - INT(a/p)*p. Параметры a и p должны быть либо оба целыми, либо оба вещественными.Если p = 0, то результат не определен. Пример: write(*, *) mod(5, 3), mod(5.3, 3.0) ! 2 2.300000 MODULO(a, p) - возвращает a по модулю p. Параметры a и p должны быть либо оба целыми, либо оба вещественными. Результат r таков, что a = q * p + r, где q - целое число; |r| < p, и r имеет тот же знак, что и p. Если p = 0, то результат не определен. Для вещественных a и p MODULO(a, p) = a - FLOOR(a / p) * p . Пример: print *, modulo(8, 5) ! 3 (q = 1) print *, modulo(-8, 5) ! 2 (q = -2) print *, modulo(8, -5) ! -2 (q = -2) print *, modulo(7.285, 2.35) ! 2.350001E-01 (q = 3) print *, modulo(7.285, -2.35) ! -2.115 (q = -4) SIGN(a, b) - возвращает абсолютную величину a, умноженную на +1, если b ≥ 0, и -1, если b < 0. Параметры a и b должны быть либо оба целыми, либо оба вещественными. Пример.Функция SIGN вернет 1.0, если второй ее аргумент - ya - больше нуля или равен ему, и -1.0 - в противном случае. result = sign(1.0, ya) 6.7. Вычисление максимума и минимума Функции нахождения максимума и минимума являются элементными и применимы к числовым данным вещественного и целого типа. Имена MAX и MIN являются родовыми. AMAX0(a1, a2, [, a3, ...]) - возвращает максимум из двух или более значений стандартного целого типа. Результат имеет стандартный вещественный тип. 178 6. Встроенные процедуры MAX(a1, a2, [, a3, ...]) - возвращает максимум из двух или более целых или вещественных значений. Тип и разновидность типа результата совпадают с типом параметров. MAX1(a1, a2, [, a3, ...]) - возвращает максимум из двух или более значений стандартного вещественного типа. Результат имеет стандартный целый тип. AMIN0(a1, a2, [, a3, ...]) - возвращает минимум из двух или более значений стандартного целого типа. Результат имеет стандартный вещественный тип. MIN(a1, a2, [, a3, ...]) - возвращает минимум из двух или более целых или вещественных значений. Тип и разновидность типа результата совпадают с типом параметров. MIN1(a1, a2, [, a3, ...]) - возвращает минимум из двух или более значений стандартного вещественного типа. Результат имеет стандартный целый тип. Во всех случаях параметры функций - скалярные выражения. Пример: write(*, *) max1(5.2, 3.6, 9.7) ! 9 write(*, *) amin0(5, -3, 9) ! -3.0 |