- X должен иметь вещественный тип
- катенация двух строковых литералов
- катенация символьного и строкового литералов
- - катенация двух символьных литералов
У н а р н ы е аддитивные операции
Унарные аддитивные операции + и — предопределены для любого числового типа и имеют свой обычный смысл. Для этих операций операнд и результат имеют один и тот же тип (см. табл. 4.5).
Таблица 4.5
Знак операции |
Операция |
Тип операнда |
Тип результата |
+ |
Сохранение знака Изменение знака |
Любой числовой тип Любой числовой тип |
Тот же числовой тип Тот же числовой тип |
М у л ь т и п л и к а т и в н ы е операции
Операции * и / предопределены для любого целого и любого плавающего типа и имеют свой обычный смысл. Операции 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, если правый операнд равен нулю.
Примеры:
INTEGER: = 1;
INTEGER: = 2;
INTEGER: = 3;
X: ВЕЩЕСТВ digits 6: = 1.0; - -см. 3.5.7
Y: ВЕЩЕСТВ digits 6: = 2.0;
ДРОБЬ delta 0.0001: = 0.1; - - см. 3.5.9
ДРОБЬ 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 |
О п е р а ц и и высшего приоритета ,
Унарная операция высшего приоритета abs предопределена для любого числового типа. Унарная операция высшего приоритета not предопределена для любого логического типа и любого одномерного индексируемого типа с компонентами логического типа. Характеристики операций приведены в табл. 4.11.
Таблица 4.11
Знак операции |
Операция |
Тип операнда |
Тип результата |
abs |
Абсолютное значение |
Любой числовой тип |
Тот же числовой тип |
not |
Логическое отрицание |
Любой логический тип Одномерный массив с логическими компонентами |
Тот же логический тип Тот же индексируемый тип |
Операция not, применяемая к одномерному массиву с логическими компонентами, вырабатывает одномерный логический массив с теми же самыми границами; каждый компонент результата получается как логическое отрицание соответствующего компонента операнда (т. е. компонента с тем же значением индекса).
Операция возведения в степень ** предопределена для каждого целого и для каждого плавающего типов (табл. 4.12). В обоих случаях правый операнд, называемый показателем степени, имеет предопределенный тип INTEGER.
Таблица 4.12
Знак операции |
Операция |
Тип левого операнда |
Тип правого операнда |
Тип результата |
* * |
Возведение в степень |
Любой целый тип Любой плавающий тип |
INTEGER INTEGER |
Тип левого операнда Тип левого операнда |
Возведение в степень с положительным показателем эквивалентно повторяющемуся умножению операнда на себя слева направо, в соответствии со значением показателя. Для операнда плавающего типа показатель степени может быть отрицательным, в этом случае результат — обетная величина результата с положительной степенью. Возведение в нулевую степень дает в результате единицу. Возведение в степень значения плавающего типа является приближенным (см. 4.5.7). При возведении целого значения в отрицательную степень возбуждается исключение CONSTRAINT_ERROR.
Т о ч н о с т ь операций с вещественными операндами
Вещественный подтип определяет множество модельных чисел. В терминах модельных чисел определяются точность, с которой базовые и предопределенные операции вырабатывают вещественный результат, и результат предопределенных операций отношения с вещественными операндами.
Модельный интервал подтипа — это интервал с границами, являющимися модельными числами этого подтипа. Связанный с принадлежащими вещественному подтипу значением, модельный интервал является наименьшим модельным интервалом (данного подтипа), который содержит это значение (модельный интервал, связанный с модельным числом некоторого подтипа, состоит только из этого числа) .
Для любой базовой или предопределенной операции, вырабатывающей результат вещественного подтипа, требуемые границы результата задаются модельным интервалом, который определяется следующим образом:
Модельный интервал результата — это наименьший модельный интервал (подтипа результата), который включает в себя минимальное и максимальное из всех значений, получаемых при применении (точной) математической операции, где каждый операнд — это любое значение из модельного интервала (подтипа операнда), определенного для этого операнда.
Модельный интервал операнда, который сам является результатом операции, отличной от неявного преобразования, является модельным интервалом результата этой операции.
Модельный интервал операнда, значение которого получено неявным преобразованием универсального выражения, является модельным интервалом, соответствующим этому значению из подтипа операнда.
Модельный интервал результата неопределен, если абсолютное значение хотя бы одного из упомянутых выше математических результатов превышает наибольшее хранимое число типа результата. Всякий раз, когда модельный интервал результата неопределен, и реализация не может обеспечить, чтобы фактический результат лежал в диапазоне хранимых чисел, крайне желательно возбуждение исключения NUMERIC_ERROR. Правилами языка, однако, этого не требуется, так как для некоторых объектных машин нет простых методов обнаружения переполнения. Значение атрибута MACHINE OVERFLOWS указывает, возбуждает ли объектная машина исключение NUMERIC_ERROR в ситуациях переполнения (см. 13.7.3).
Хранимые числа вещественного типа определены (см. 3.5.6) как надмножество модельных чисел, границы ошибок которых подчиняются тем же правилам, что и для модельных чисел. Любое задаваемое в этом разделе в терминах модельных интервалов определение может поэтому быть распространено на хранимые интервалы хранимых чисел. Следствием такого распространения является то, что для реализации не допускается возбуждение исключения NUMERIC_ERROR, если интервал результата является хранимым интервалом.
Для результата операции возведения в степень модельный интервад, определяющий границы результата, определяется по приведенным выше правилам, которые применяются к последовательным умножениям при вычислении степени, и к заключительному делению, если показатель степени — отрицательное число.