4.5. ОПЕРАЦИИ И ВЫЧИСЛЕНИЕ ВЫРАЖЕНИЯ

В языке определяется шесть классов операций. При описании функций, определяющих пользовательские операции, 6 качестве обозначений могут быть использованы приведенные ниже знаки операций (исключая /=). Шесть классов операций приведены в порядке возрастания их старшинства.

логическая-операция          ::= and | ог | xor операция-отношения           ::= =  | /= | <|<=|>|>=бинарная-аддитивная-операция ::= +  | - | & унарная-аддитивная-операция  ::= +  | -мультипликативная-операция   ::= *  | / | mod | геm операция-высшего-приоритета  ::= ** | abs | лоt

Формы управления промежуточной проверкой and then и ог else имеют тот же порядок старшинства, что и логические операции. Проверки принадлежности in и not in имеют то же старшинство, что и операции отношения.

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

В языке не определяется порядок вычисления операндов множителя, слагаемого, простого выражения или отношения и операндов выражения, которое не содержит форм управленияпромежуточной проверки (но вычисление производится до применения соответствующей операции). Правый операнд формы управления промежуточной проверкой вычисляется тогда и только тогда, когда левый операнд имеет определенное значение (см. 4.5.1).

Для каждой формы описания типа некоторые из перечисленных операций являются предопределенными, т. е. неявно вводятся описанием типа. Для каждого такого неявного описания операции именами параметров являются LEFT и RIGHT для бинарных операций; для унарных аддитивных операций и унарных операций abs и not их единственный параметр именуется RIGHT. В разд. 4.5.1 — 4.5.7 поясняются результаты предопределенных операций.

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

Примеры старшинства:

not SUNNY or WARM     -- совпадает с (not SUNNY) or WARM           Х > 4.0 and Y > 0.0                -- совпадает с (X > 4.0) and (Y > 0.0) -4.0 * А ** 2                           -- совпадает с -(4.0 * (А ** 2))             abs (1 + А) + В                          -- совпадает с (abs (1 + А)) + В             Y ** (-3)                               -- скобки необходимы                         А/В * С                                 -- совпадает с (А/В) * С                     А + (В + С)                             -- вычисляется В + С, а затем к результату                                           -- прибавляется А                            

Ссылки: вещественный тип 3.5.6, в некотором порядке 1.6, возбуждение исключения 11, выражение 4.4, диапазон 3.5, имя 4.1, исключение NUMERIC-ERROR 11.1, множитель 4.4, неявное описание 3.1, обозначение 6.1, описание типа 3.3.1, отношение 4.4, проверка вхождения 4.5.2, простое выражение 4.4, слагаемое-4.4, совмещение 6.6, 8.7, тип 3.3, универсальный-вещественный тип 3.5.6, универсальный-целый тип 3.5.4, форма управления промежуточной проверкой 4.5, 4.5.1, хранимое число 3.5.6, целый тип 3.5.4.

4.5.1. ЛОГИЧЕСКИЕ ОПЕРАЦИИ И ФОРМЫ УПРАВЛЕНИЯ ПРОМЕЖУТОЧНОЙ ПРОВЕРКОЙ

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

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

Операция

Тип операнда

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

and

Конъюнкция

Любой логический тип Массив логических компонент

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

ог

Дизъюнкция

Любой логический тип Массив логических компонент

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

тип

хог

Исключающая дизъюнкция

Любой логический

ТИП

Массив логических компонент

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

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

Операции над массивами выполняются покомпонентно, если компоненты имеются (как для равенства, см. 4.5.2). Границы массива-результата совпадают с границами левого операнда. Для каждой компоненты левого операнда проверяется наличие соответствующей компоненты правого операнда, и наоборот. При нарушении соответствия компонент возбуждается исключение CONSTRAINT_ERROR.

Формы управления промежуточной проверкой and then и or else определены для двух операндов логического типа и вырабатывают результат того же самого типа. Левый операнд формы управления промежуточной проверкой всегда вычисляется первым. Если левый операнд выражения с формой and then дает значение FALSE, то правый операнд не вычисляется и значением выражения является FALSE. Если левый операнд с формой or else дает TRUE то правый операнд не вычисляется и значением выражения является TRUE. Если вычисляют ся оба операнда, то результат and then такой же, как and, а результат or else — как ог.

Примечание. Обычный смысл логических операций задается следующей таблицей истинности:

А

В

A and B

A or B

A xor B

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

FALSE

Примеры логических операций:

SUNNY or WARMFILTER(1 .. 10) and FILTER(15 .. 24) -- см. 3.6.1

Примеры форм управления с промежуточной проверкой:

NEXT_CAR.OWNER /= null and then NEXT_CAR.OWNER.AGE > 25 N = 0 or else A(N) = HIT_VALUE                 -- см. 3.8.1

Ссыпки: возбуждение исключений 11, граница диапазона индекса 3.6.1, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента массива 3.6, логический тип 3.5.3, логическое значение FALSE 3.5.3, логическое значение TRUE 3.5.3, операция 4.5, операция типа 3.3, подтип индекса 3.6, предопределенная операция 4.5, пустой массив 3.6.1, размерность 3.6, сопоставимые компоненты массивов 4.5.2, тип 3.3.

4.5.2. ОПЕРАЦИИ ОТНОШЕНИЯ И ПРОВЕРКИ ПРИНАДЛЕЖНОСТИ

Операции равенство и неравенство предопределены для любого типа, не являющегося лимитируемым. Остальные операции отношения являются операциями упорядочивания:< (меньше), < = (меньше или равно), > (больше), > = (больше или равно). Операции упорядочивания предопределены для любого скалярного типа и любого дискретного индексируемого типа (одномерного индексируемого типа с компонентами дискретного типа). Операнды каждой предопределенной операции отношения имеют один и тот же тип. Тип результата — предопределенный тип — BOOLEAN.

Смысл операций отношения традиционный: результат равен TRUE, если соответствующее отношение удовлетворено, результат равен FALSE в противном случае. Операция нер-зенства дает результат, противоположный результату операции равенства: FALSE, если операнды равны; TRUE — если не равны.

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

Операция

Тип операнда

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

= /=

Равенство и неравенство

Любой тип

BOOLEAN

< < = > > =

Проверка упорядоченности

Любой скалярный

ТИП

BOOLEAN

Дискретный индексируемый ТИП

BOOLEAN

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

Для двух значений одного и того же индексируемого типа или именуемого типа левый операнд равен правому, если и только если для каждой компоненты левого операнда имеется сопоставленная компонента правого операнда, и наоборот; значения сопоставленных компонент равны в смысле предопределенной операции равенства для типа этих компонент. В частности, всегда равны два пустых массива одного и того же типа, всегда равны две пустые записи одного и того же типа.

Для сравнения двух записей одинакового типа сопоставленными компонентами являются компоненты[5] с одинаковыми идентификаторами компонент.

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

Если равенство явно определено для лимитируемого типа, оно не распространяется на составные типы, имеющие подкомпоненты лимитируемого типа (допускается явное определение равенства для таких составных типов).

Операции упорядочивания <, <=, > и >=, которые определены для дискретных индексируемых типов, соответствуют лексикографическому порядку, основанному на предопределенном отношении порядка для типов компонент. Пустой массив лексикографически меньше массива, имеющего по крайней мере одну компоненту. Для непустых массивов левый операнд лексикографически меньше правого операнда, если первая компонента левого операнда меньше первой компоненты правого операнда или если их первые компоненты равны, а хвост левого операнда лексикографически меньше правого (хвост состоит из оставшихся компонент, исключая первую, и может быть пустым).

Проверки принадлежности in и not in предопределены для всех типов. Типом результата является предопределенный тип BOOLEAN. Для проверки принадлежности диапазону простое выражение и границы диапазона должны быть одного и того же скалярного типа; для проверки принадлежности с обозначением типа тип простого выражения должен быть базовым для этого обозначения. Вычисление проверок принадлежности in вырабатывает результат TRUE, если значение простого выражения принадлежит данному диапазону или это значение принадлежит подтипу, заданному обозначением типа; в противном случае вычисление вырабатывает результат FALSE (для значений вещественного типа см. 4.5.7). Проверка принадлежности not in вырабатывает результат, противоположный результату проверки принадлежности in.

Примеры:

X /= Y"" < "А" and "А" < "АА" -- TRUE "АА" < "В" and "А" < "А " -- TRUEMY_CAR = null --истина, если MY_CAR пуст (см. 3.8.1) MY_CAR = YOUR_CAR -- истина, если используется один и тот же автомобиль MY_CAR.all = YOUR_CAR.all -- истина, если оба автомобиля идентичныN not in 1..10 -- проверка принадлежности диапазону TODAY in MON .. FRI -- проверка принадлежности диапазону TODAY in WEEKOAY -- проверка принадлежности подтипу (см. 3.5.1) ARCHIVE in DISKUNIT -- проверка принадлежности подтипу (см. 3.7.3)

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

Если именуемый тип имеет компоненты, зависящие от дискриминантов, то компоненты двух значений сопоставлены тогда и только тогда, когда равны их дискриминанты. Компонентынепустых массивов сопоставлены, если и только если значения атрибута LENGTH(N) для каждой позиции индекса одинаковы у обоих массивов.

Ссылки: базовый тип 3.3, возбуждение исключения 11, вычисление 4.5, граница диапазона 3.5, диапазон 3.5, диапазон индекса 3.6, дискретный тип 3.5, идентификатор компоненты 3.7, именуемый тип 3.7, индекс 3.6, индексируемый тип 3.6, исключение 11, компонента 3.3, лимитируемый тип 7.4.4, обозначение типа 3.3.2, объект 3.2.1, операция 4.5, операция типа 3.3, подкомпонента 3.3, предопределенная операция 4.5, предопределенный логический тип 3.5.3, принадлежать подтипу 3.3, простое выражение 4.4, пустая запись 3.7, пустой массив 3.6.1, размерность 3.6, скалярный тип 3.5, следующий 3.5.5, составной тип 3.3, ссылочное значение 3.8, ссылочное значение null 3.8, тип 3.3, тип компоненты 3.3, указывать 3.8.

4.5.3. БИНАРНЫЕ АДДИТИВНЫЕ ОПЕРАЦИИ

Бинарные аддитивные операции + и - предопределены для любого числового типа и имеют свой обычный смысл. Операция катенации & предопределена для любого одномерного нелимитируемого индексируемого типа.

Знак

Операция

Тип левого

Тип правого

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

операции

операнда

операнда

+

сложение

Любой числовой ТИП

Тот же числовой ТИП

Тот же числовой ТИП

-

вычитание

Любой числовой ТИП

Тот же числовой ТИП

Тот же числовой ТИП

&

катенация

Любой индексируемый

ТИП

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

ТИП

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

ТИП

Любой индексируемый

ТИП

Тип компоненты

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

ТИП

Тип компоненты

Любой индексируемый

ТИП

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

ТИП

Тип компоненты

Тип компоненты

Любой индексируемый

ТИП

Для вещественных типов точность результата определяется типом операндов (см. 4.5.7).

Если оба операнда — одномерные массивы, то результатом катенации является одномерный массив, длина которого равна сумме длин операндов, а его компоненты составлены из компонент левого операнда и следующих за ними компонент правого операнда. Нижняя граница этого результата совпадает с нижней границей левого операнда, если левый операнд — не пустой массив; в противном случае результатом катенации является правый операнд.

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

Операцией катенации возбуждается исключение CONSTRAINT_ERROR, если верхняя граница результата выходит за диапазон подтипа индекса, кроме того случая, когда результат — не пустой массив, а также когда какой-либо операнд, тип которого есть тип компоненты, имеет значение, не принадлежащее данному подтипу компоненты.

Примеры:

Z + 0.1     -- Z должен иметь вещественный тип "А" & "BCD" -- катенация двух строковых литералов 'А' & "BCD" -- катенация символьного и строкового                 -- литералов 'А' & 'А'   -- катенация двух символьных литералов

Ссылки: вещественный тип 3.5.6, возбуждение исключений 11, диапазон подтипа индекса 3.6.1, длина массива 3.6.2, индексируемый тип 3.6, исключение CONSTRAINT-ERROR 11.1, лимитируемый тип 7.4.4, операция 4.5, операция типа 3.3, подтип индекса 3.6, предопределенная операция 4.5, пустой массив 3.6.1, размерность 3.6, символьный литерал 2.5, строковый литерал 2.6, тип 3.3, тип компоненты 3.3, числовой тип 3.5.

4.5.4. УНАРНЫЕ АДДИТИВНЫЕ ОПЕРАЦИИ

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

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

Операция

Тип операнда

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

+

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

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

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

-

Изменение знака

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

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

Ссылки: операция 4.5, операция типа 3.3, предопределенная операция 4.5, тип 3.3, числовой тип 3.5.

4.5.5. МУЛЬТИПЛИКАТИВНЫЕ ОПЕРАЦИИ

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

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

Операция

Тип операнда

Тип

результата

*

Умножение

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

Тот

же целый тип

-

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

Тот

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

/

Деление нацело

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

Тот

же целый тип

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

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

Тот

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

mod

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

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

Тот

же целый тип

rem

Остаток

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

Тот

же целый тип

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

А = (А/В)*В + (А rem В)

где (А rem В) имеет знак значения А и абсолютное значение, меньшее абсолютного значения В. Деление нацело удовлетворяет следующему тождеству:

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

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

А = В . N + (А mod В)

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

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

Операция

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

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

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

*

Умножение

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

INTEGER

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

INTEGER

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

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

/

Деление

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

INTEGER

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

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

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

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

Операция *

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

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

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

*

Умножение

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

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

Универсальный- фиксированный ТИП

/

Деление

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

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

Универсальный - фиксированный ТИП

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

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

Примеры:

I : INTEGER := 1;J : INTEGER := 2;К : INTEGER := 3;X : REAL diglts 6 := 1.0; — СМ. 3.5.7 Y : REAL diglts 6 := 2.0;F : FRACTION delta 0.0001 := 0.1; — СМ. 3.5.9 G : FRACTION delta 0.0001 := 0.1;

Выражение

Значение

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

I . J

2

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

K/J

1

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

К mod J

1

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

X/Y

0.5

Тот же, что тип Х и Y, т. е. REAL

F/2

0.05

Тот же, что тип F, т.е. FRACTION

3 *. F

0.3

Тот же, что тип F, т. е. FRACTION

F * G

0.01

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

преобразование

FRACTION (F * G)0.01

FRACTION в результате преобразования

 

REAL(J) * Y

4.0

REAL, как и тип обоих операндов после

преобразования

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

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

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

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

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

А

В

А/В

А rem В

A mod B

А

В

А/В

А rem В

A mod B

10 5 2 0 0 -10 5 -2 0 0
11 5 2 1 1 -11 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

Ссылки: базовый тип 3.3, возбуждение исключений 11, дельта фиксированного типа 3.5.9, исключение NUMERIC_ERROR 11.1, описание 3.1, описание переименования 8.5, плавающий тип 3.5.7, предопределенная операция 4.5, предопределенный пакет STANDARD 8.6, преобразование типа 4.6, фактический параметр 6.4.1, фиксированный тип 3.5.9, формальная подпрограмма настройки 12.1, целый тип 3.5.4, числовой тип 3.5.

4.5.6. ОПЕРАЦИИ ВЫСШЕГО ПРИОРИТЕТА

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

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

Операция

Тип операнда

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

abs

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

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

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

not

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

Любой логическийтип

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

Массив с логическими компонентами

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

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

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

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

Операция

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

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

Тип

результата

**

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

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

INTEGER

Тип

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

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

INTEGER

Тип

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

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

Ссылки: возбуждение исключений 11, граница массива 3.6.1, индекс 3.6, индексируемый тип 3.6, исключение CONSTRAINT_ERROR 11.1, компонента массива 3.6, логический тип 3.5.3, операция умножение 4.5.5, плавающий тип 3.5.9, предопределенная операция 4.5, размерность 3.6, целый тип 3.5.4.

4.5.7. ТОЧНОСТЬ ОПЕРАЦИЙ С ВЕЩЕСТВЕННЫМИ ОПЕРАНДАМИ

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

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

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

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

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

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

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

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

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

Для результата операции отношения между двумя вещественными операндами рассмотрим модельный интервал (подтипа операнда), определенный для каждого такого операнда; результат может быть любым значением, полученным при применении математической операции сравнения к значениям, произвольно выбранным в соответствующих модельных интервалах операндов. Если один или оба модельных интервала операндов не определены (и если при вычислении операндов не было возбуждено исключение), то в качестве результата сравнения допустимо любое возможное значение (т. е. либо TRUE, либо FALSE).

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

Примечание. Для плавающего типа числа 15.0, 3.0 и 5.0 всегда являются модельными числами. Следовательно, X/Y, где Х равно 15.0, а Y — 3.0, согласно приведенным выше правилам, вырабатывает в результате точно 5.0. В общем случае деление не вырабатывает в результатемодельные числа, и, следовательно, нельзя рассчитывать, что выполнено равенство (1.0/Х)'Х =1.0.

Ссылки: атрибут 4.1.4, атрибут MACHINE_OVERFLOWS 13.7.1, базовая операция типа 3.3.3, вещественный тип 3.5.6, возбуждение исключений 11, граница диапазона 3.5, граница ошибки 3.5.6, диапазон 3.5, исключение NUMERIC_ERROR 11.1, логическое значение FALSE 3.5.3, логи-' ческое значение TRUE 3.5.3, модельное число 3.5.6, обозначение типа 3.3.2, операция возведения в степень 4.5.6, операция отношение 4.5, 4.5.2, операция умножение 4.5.5, отношение 4.4, плавающий тип 3.5.9, подтип 3.3, предопределенная операция типа 3.3.3, преобразование типа 4.6, проверка вхождения 4.5.2, универсальное выражение 4.10, хранимое число 3.5.6.



[5] Если они есть. - Прим. ред.