• - X должен иметь вещественный тип

  • - катенация двух строковых литералов

  • - катенация символьного и строкового литералов

- - катенация двух символьных литералов

  1. У н а р н ы е аддитивные операции

Унарные аддитивные операции + и — предопределены для любого число­вого типа и имеют свой обычный смысл. Для этих операций операнд и ре­зультат имеют один и тот же тип (см. табл. 4.5).

Таблица 4.5

Знак операции

Операция

Тип операнда

Тип результата

+

Сохранение знака Изменение знака

Любой числовой тип

Любой числовой тип

Тот же числовой тип Тот же числовой тип



  1. М у л ь т и п л и к а т и в н ы е операции

Операции * и / предопределены для любого целого и любого плавающе­го типа и имеют свой обычный смысл. Операции mod и rem предопределены для любого целого типа. Для каждой из этих операций операнды и резуль­тат имеют один и тот же базовый тип. Для плавающих типов точность ре­зультата определяется типом операндов (см. 4.5.7). Характеристики опера­ций сведены в табл. 4.6.

Таблица 4.6

Знак операции

Операция

Тип операнда

Тип результата

*

Умножение

Любой целый тип

Любой плавающий тип

Тот же целый тип

Тот же плавающий тип

/

Целое деле­ние

Любой целый тип

Тот же целый тип


Деление плавающих

Любой плавающий тип

Тот же плавающий тип

mod

Вычет по модулю

Любой целый тип

Тот же целый тип

rem

Остаток

Любой целый тип

Тот же целый тип



Целое деление и остаток связаны следующим соотношением:

А = (А/В) * В + (A rem В), где (A rem В) имеет знак значения А и абсолютное значение, меньшее абсо­лютного значения В. Целое деление удовлетворяет следующему тождеству:

(_А)/В = -(А/В) =А/(-В)

Результат операции вычета по модулю таков, что (A mod В) имеет знак значения В и абсолютное значение, меньшее абсолютного значения В, и су­ществует целое значение К такое, что должно удовлетворяться следующее соотношение:

А = В * К + (A mod В)

Для каждого фиксированного типа предопределены операции умноже­ния и деления на операнд предопределенного типа INTEGER (см. табл. 4.7).

Таблица 4.7

Знак операции

Операция

Тип левого операнда

Тип правого операнда

Тип результат

*

Умножение

Любой фиксиро­ванный тип INTEGER

INTEGER

Любой фиксирован­ный тип

Тип левого операн­да

Тип правого опе­ранда

/

Деление

Любой фиксиро­ванный тип

INTEGER

Тип левого операн­да

Умножение значения фиксированного типа на целое эквивалентно пов­торению операции сложения. Деление значения фиксированного типа на це­лое является приближенным и не меняет типа (см. 4.5.7).

Две специальные операции умножения и деления, применимые к опе­рандам любых фиксированных типов, описаны в предопределенном пакете STANDARD (вследствие других правил они не могут быть переименованы или даны в качестве фактических параметров настройки). Соответствую­щие характеристики приведены в табл. 4.8.

Таблица 4.8

Знак операции

Операция

Тип левого операнда

Тип правого операнда

Тип результат

*

Умножение

Любой фиксиро­ванный тип

Любой фиксирован­ный ТИП

универсальный __ фиксированный тип

/

Деление

Любой фиксиро­ванный тип

Любой фиксирован­ный тип

универсальный _ фиксированный тип

Операнды умножения могут быть одного и того же или различных фик­сированных типов, а тип результата — анонимный предопределенный уни­версальный ^.фиксированный, дельта которого произвольно мала. Результат любого такого умножения всегда должен быть явно преобразован в значе­ние некоторого числового типа. Это обеспечивает явное управление точ­ностью вычислений. То же относится к делению значения фиксированного типа на другое значение фиксированного типа. Никакие другие операции для типа универсальный-фиксированный не определены.

Исключение NUMERIC_ERROR возбуждается операциями целого деле­ния, теш и mod, если правый операнд равен нулю.

Примеры:

  1. INTEGER: = 1;

  2. INTEGER: = 2;

  3. INTEGER: = 3;

X: ВЕЩЕСТВ digits 6: = 1.0; - -см. 3.5.7

Y: ВЕЩЕСТВ digits 6: = 2.0;

  1. ДРОБЬ delta 0.0001: = 0.1; - - см. 3.5.9

  2. ДРОБЬ delta 0.0001: = 0.1;

Характеристики результатов операций над объектами из примеров при­ведены в табл. 4.9.

Таблица 4.9

Выражение ,

Зна­чение

Тип результата

I * J

2

Тот же, что тип I и J, т. e. INTEGER

K/J

1

Тот же, что тип К и J, т. е. INTEGER

К mod J

1

Тот же, что тип К и J, т. е. INTEGER

X/Y

0.5

Тот же, что тип X и Y, т. е. ВЕЩЕСТВ

F/2

0.05

Тот же, что тип F, т. е. ДРОБЬ

3*F

0.3

Тот же, что тип F, т. е. ДРОБЬ

F * G

0.01

универсальный-фиксированный требуется преобра­зование

ДРОБЬ (F * G)

0.01

ДРОБЬ в результате преобразования

ВЕЩЕСТВ (J) * Y

4.0

ВЕЩЕСТВ, как и тип обоих операндов после преоб­разования



Примечание. Для положительных А и В А/В - задает частное, a A rem В - остаток от деления А на В. Операция rem удовлетворяет следующим соотношениям:

A rem (-В) = A rem В

(-А) rem В = - (A rem В)

Для любого целого К справедливо следующее тождество:

A mod В = (А + К * В) mod В

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

Таблица 4.10

А

В

А/В

A rem В

A mod в

А

В

А/В

A rem В

A mod в

10

5

2

0

0

-10

5

-2

0

0

и

5

2

1

1

5

-2

-1

4

12

5

2

2

2

-12

5

-2

-2'

3

13

5

2

3

3

-13

5

-2

-3

2

14

5

2

4

. 4

-14

5

-2

—4

1

10

-5

-2

0

0

-10

-5

2

0

0

11

-5

—2

1

-4

-11

-5

2

-1

-1

12

-5

-2

2

-3

-12

-5

2

-2

-2

13

-5

-2

3

-2

-13

-5

2

-3

-3

14

-5

-2

4

-1

-14

-5

2

-4

-4



  1. О п е р а ц и и высшего приоритета ,

Унарная операция высшего приоритета abs предопределена для любого числового типа. Унарная операция высшего приоритета not предопределена для любого логического типа и любого одномерного индексируемого типа с компонентами логического типа. Характеристики операций приведены в табл. 4.11.

Таблица 4.11

Знак операции

Операция

Тип операнда

Тип результата

abs

Абсолютное значение

Любой числовой тип

Тот же числовой тип

not

Логическое отрицание

Любой логический тип Одномерный массив с логи­ческими компонентами

Тот же логический тип

Тот же индексируемый тип



Операция not, применяемая к одномерному массиву с логическими компонентами, вырабатывает одномерный логический массив с теми же са­мыми границами; каждый компонент результата получается как логичес­кое отрицание соответствующего компонента операнда (т. е. компонента с тем же значением индекса).

Операция возведения в степень ** предопределена для каждого целого и для каждого плавающего типов (табл. 4.12). В обоих случаях правый опе­ранд, называемый показателем степени, имеет предопределенный тип INTE­GER.

Таблица 4.12

Знак операции

Операция

Тип левого операнда

Тип правого операнда

Тип результата

* *

Возведение в степень

Любой целый тип Любой плавающий тип

INTEGER INTEGER

Тип левого операнда

Тип левого операнда



Возведение в степень с положительным показателем эквивалентно пов­торяющемуся умножению операнда на себя слева направо, в соответствии со значением показателя. Для операнда плавающего типа показатель степе­ни может быть отрицательным, в этом случае результат — обетная величи­на результата с положительной степенью. Возведение в нулевую степень да­ет в результате единицу. Возведение в степень значения плавающего типа является приближенным (см. 4.5.7). При возведении целого значения в от­рицательную степень возбуждается исключение CONSTRAINT_ERROR.

  1. Т о ч н о с т ь операций с вещественными опе­рандами

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

Модельный интервал подтипа — это интервал с границами, являющими­ся модельными числами этого подтипа. Связанный с принадлежащими ве­щественному подтипу значением, модельный интервал является наимень­шим модельным интервалом (данного подтипа), который содержит это зна­чение (модельный интервал, связанный с модельным числом некоторого подтипа, состоит только из этого числа) .

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

  • Модельный интервал результата — это наименьший модельный интер­вал (подтипа результата), который включает в себя минимальное и макси­мальное из всех значений, получаемых при применении (точной) математи­ческой операции, где каждый операнд — это любое значение из модельного интервала (подтипа операнда), определенного для этого операнда.

  • Модельный интервал операнда, который сам является результатом операции, отличной от неявного преобразования, является модельным ин­тервалом результата этой операции.

  • Модельный интервал операнда, значение которого получено неявным преобразованием универсального выражения, является модельным интер­валом, соответствующим этому значению из подтипа операнда.

Модельный интервал результата неопределен, если абсолютное значение хотя бы одного из упомянутых выше математических результатов превы­шает наибольшее хранимое число типа результата. Всякий раз, когда мо­дельный интервал результата неопределен, и реализация не может обеспе­чить, чтобы фактический результат лежал в диапазоне хранимых чисел, крайне желательно возбуждение исключения NUMERIC_ERROR. Правилами языка, однако, этого не требуется, так как для некоторых объектных ма­шин нет простых методов обнаружения переполнения. Значение атрибута MACHINE OVERFLOWS указывает, возбуждает ли объектная машина ис­ключение NUMERIC_ERROR в ситуациях переполнения (см. 13.7.3).

Хранимые числа вещественного типа определены (см. 3.5.6) как над­множество модельных чисел, границы ошибок которых подчиняются тем же правилам, что и для модельных чисел. Любое задаваемое в этом разделе в терминах модельных интервалов определение может поэтому быть рас­пространено на хранимые интервалы хранимых чисел. Следствием такого распространения является то, что для реализации не допускается возбужде­ние исключения NUMERIC_ERROR, если интервал результата является хра­нимым интервалом.

Для результата операции возведения в степень модельный интервад, оп­ределяющий границы результата, определяется по приведенным выше пра­вилам, которые применяются к последовательным умножениям при вычис­лении степени, и к заключительному делению, если показатель степени — отри­цательное число.