Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
242
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

6. Встроенные процедуры

SPACING(x) - возвращает вещественное значение с таким же параметром типа, как у x, равное абсолютному расстоянию между числами

в двоичном представлении, в области, близкой к x, т. е. 2PE .

print *, spacing(3.0_4)

!

2.384186e-07

print *, spacing(-3.0_4)

!

2.384186e-07

6.13. Преобразования для параметра разновидности

Следующие две функции возвращают минимальное значение параметра разновидности, удовлетворяющее заданным критериям. Аргументы и результаты функций - скаляры. Тип результата - стандартный целый.

SELECT_INT_KIND(r) - возвращает значение параметра разновидности целого типа, в котором содержатся все целые числа интервала -10r < n < 10r. При наличии более одной подходящей разновидности выбирается наименьшее значение параметра разновидности. Результат равен -1, если ни одна из разновидностей не содержит все числа интервала, задаваемого аргументом r.

print *, selected_int_kind(8) print *, selected_int_kind(3) print *, selected_int_kind(10)

!4

!2

!-1 (нет подходящей разновидности)

SELECTED_REAL_KIND([p] [, r]) - возвращает значение параметра разновидности вещественного типа, в котором содержатся все вещественные числа интервала -10r < x < 10r, десятичная точность которых не хуже p. Не допускается одновременное отсутствие двух аргументов. При наличии более одной подходящей разновидности выбирается разновидность с наименьшей десятичной точностью. Функция возвращает -1, если недоступна требуемая точность. Возвращает -2, если недоступен требуемый десятичный степенной диапазон. Возвращает -3, если недоступно ито и другое. Например:

kp = 0

 

 

 

do while(selected_real_kind(p = kp) > 0)

 

 

 

kp = kp + 1

 

 

 

end do

 

 

 

kr = 300

 

 

 

do while(selected_real_kind(r = kr) > 0)

 

 

 

kr = kr + 1

 

 

 

end do

 

 

 

print *, selected_real_kind(p = kp), kp

!

-1

16

print *, selected_real_kind(r = kr), kr

!

-2

308

print *, selected_real_kind(kp, kr)

!

-3

 

end

 

 

 

6.14. Процедуры для работы с битами

Встроенные процедуры работают с битами, которые содержатся в машинном представлении целых чисел. В основе процедур лежит модель,

191

О. В. Бартеньев. Современный ФОРТРАН

согласно которой целое число содержит s бит со значениями wk, k = 0, 1, ..., s - 1. Нумерация битов выполняется справа налево: самый правый бит имеет номер 0, а самый левый - s - 1. Значение wk k-го бита может равняться либо нулю, либо единице.

6.14.1. Справочная функция BIT_SIZE

BIT_SIZE(i) - возвращает число бит, необходимых для представления целых чисел с такой же разновидностью типа, как у аргумента. Результат имеет тот же параметр типа, что и аргумент.

Тип i

BIT_SIZE(i)

 

 

INTEGER(1)

8

 

 

INTEGER(2)

16

 

 

INTEGER(4)

32

 

 

6.14.2. Элементные функции для работы с битами

BTEST(i, pos) - возвращает стандартную логическую величину, равную

.TRUE., если бит с номером pos целого аргумента i имеет значение 1,

и.FALSE. - в противном случае. Аргумент pos должен быть целого типа

ииметь значение в интервале 0 pos < BIT_SIZE(i).

Пример:

integer(1) :: iarr(2) = (/ 2#10101010, 2#11010101 /)

 

logical result(2)

 

result = btest(iarr, (/ 0, 0 /))

! F T

write(*, *) result

 

write(*, *) btest(2#0001110001111000, 2)

! F

write(*, *) btest(2#0001110001111000, 3)

! T

IAND(i, j) - возвращает логическое И между соответствующими битами аргументов i и j: устанавливает в k-й разряд результата 1, если k-й разряд первого и второго параметров равен единице. В противном случае в k-й разряд результата устанавливается 0. Целочисленные аргументы i и j должны иметь одинаковые параметры типа. Тот же параметр типа будет иметь и результат.

IBCHNG(i, pos) - возвращает целый результат с таким же параметром типа, как у i, и значением, совпадающим с i, за исключением бита с номером pos, значение которого заменяется на противоположное. Аргумент pos должен быть целым и иметь значение в интервале 0 pos < BIT_SIZE(i).

IBCLR(i, pos) - возвращает целый результат с таким же параметром типа, как у i, и значением, совпадающим с i, за исключением бита с номером pos, который обнуляется. Аргумент pos должен быть целым и иметь значение в интервале 0 pos < BIT_SIZE(i).

192

6. Встроенные процедуры

IBITS(i, pos, len) - возвращает целый результат с таким же параметром типа, как у i, и значением, равным len битам аргумента i, начиная с бита с номером pos; после смещения этой цепочки из len бит вправо и обнуления всех освободившихся битов. Аргументы pos и len должны быть целыми и иметь неотрицательные значения, такие, что pos

+ len BIT_SIZE(i). Например:

k = ibits(2#1010, 1, 3)

! Возвращает 2#101 = 5

print '(b8)', k

! 101

IBSET(i, pos) - возвращает целый результат с таким же параметром типа, как у i, и значением, совпадающим с i, за исключением бита с номером pos,

вкоторый устанавливается единица. Аргумент pos должен быть целым

ииметь значение в интервале 0 pos < BIT_SIZE(i).

IEOR(i, j) - возвращает логическое исключающее ИЛИ между соответствующими битами аргументов i и j: устанавливает в k-й разряд результата 0, если k-й разряд первого и второго параметров равен или единице, или нулю. В противном случае в k-й разряд результата устанавливается единица. Целочисленные аргументы i и j должны иметь одинаковые параметры типа. Тот же параметр типа будет иметь и результат.

IOR(i, j) - возвращает логическое ИЛИ между соответствующими битами аргументов i и j: устанавливает в k-й разряд результата единицу, если k-й разряд хотя бы одного параметра равен единице. В противном случае в k-й разряд результата устанавливается 0. Целочисленные аргументы i и j должны иметь одинаковые параметры типа. Тот же параметр типа будет иметь и результат.

Пример:

integer(2) :: k = 198

!

198

( = 2#11000110 )

integer(2) :: mask = 129

!

129

( = 2#10000001 )

write(*, *) iand(k, mask)

!

128

( = 2#10000000 )

write(*, *) ieor(k, mask)

!

71

( = 2#01000111 )

write(*, *) ior(k, mask)

!

199

( = 2#11000111 )

ISHA(i, shift) - (арифметический сдвиг) возвращает целый результат с таким же параметром типа, как у i, и значением, получаемым в результате сдвига битов параметра i на shift позиций влево (или на -shift позиций вправо, если значение shift отрицательно). Освобождающиеся при сдвиге влево биты обнуляются, а при сдвиге вправо заполняются значением знакового бита. Аргумент shift должен быть целым и удовлетворять неравенству |shift| BIT_SIZE(i).

ISHC(i, shift) - (циклический сдвиг) возвращает целый результат с таким же параметром типа, как у i, и значением, получаемым в результате циклического сдвига всех битов параметра i на shift позиций влево (или на - shift позиций вправо, если значение shift отрицательно). Циклический сдвиг выполняется без потерь битов: вытесняемые с одного конца биты

193

О. В. Бартеньев. Современный ФОРТРАН

появляются в том же порядке на другом. Аргумент shift должен быть целым, причем |shift| BIT_SIZE(i).

ISHFT(i, shift) - (логический сдвиг) возвращает целый результат с таким же параметром типа, как у i, и значением, получаемым в результате сдвига битов параметра i на shift позиций влево (или на -shift позиций вправо, если значение shift отрицательно). Освобождающиеся биты как при левом, так и при правом сдвиге обнуляются. В отличие от арифметического сдвига, сдвигается и знаковый разряд. Аргумент shift должен быть целым и удовлетворять неравенству |shift| BIT_SIZE(i).

ISHTC(i, shift [, size]) - возвращает целый результат с таким же параметром типа, как у i, и значением, получаемым в результате циклического сдвига size младших (самых правых) битов параметра i (или всех битов, если параметр size опущен) на shift позиций влево (или на -shift позиций вправо, если значение shift отрицательно). Аргументы shift и size должны быть целыми, причем 0 < size BIT_SIZE(i); |shift| size или |shift| BIT_SIZE(i), если опущен параметр size.

ISHL(i, shift) - выполняет те же действия, что и функция ISHFT.

Пример:

integer(1) :: k = -64

!

-64

( = 2#11000000 )

integer(1) :: i = 10

!

10

( = 2#00001010 )

integer(2) :: j = 10

!

10

( = 2#0000000000001010 )

! Функция ISHA (правый сдвиг)

 

 

 

print '(1x, b8.8)', isha(k, -3)

!

11111000

( = -8 )

! Функция ISHL (правый сдвиг)

 

 

 

print '(1x, b8.8)', ishl(k, -3)

!

00011000

( = 24 )

! Функция ISHC (левый сдвиг)

 

 

 

print '(1x, b8.8)', ishc(i, 5)

!

01000001

( = 65 )

! Функция ISHFT (тот же результат выдадут функции ISHA и ISHL)

print '(1x, b8.8)', ishft(i, 5)

!

01000000

( = 64 )

! Функция ISHFTC

 

 

 

print '(1x, b8.8)', ishftc(i, 2, 3)

!

00001001

( = 9 )

print '(1x, b8.8)', ishftc(i, -2, 3)

!

00001100

( = 12 )

print '(1x, b16.16)', ishftc(j, 2, 3)

!

0000000000001001

( = 9 )

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

Например, NOT(2#1001) возвращает 2#0110.

6.14.3. Элементная подпрограмма MVBITS

CALL MVBITS(from, frompos, len, to, topos) - копирует из from

последовательность из len бит, начиная с бита номер frompos, в to, начиная с бита номер topos. Остальные биты в to не меняются. Отсчет позиций

194