Арифметическими операторами, которым требуется один операнд, являются тождество (+) и отрицание (-). Операнд должен иметь числовой тип (NUMBER, INTEGER или REAL). Результат оператора (+) равен операнду, результат оператора (-) имеет знак, противоположный знаку операнда. Если операнд имеет неопределенное (?) значение, то результат также будет иметь неопределенное (?) значение для обоих операторов.
Арифметическими операторами, которым требуются два операнда, являются сложение (+), вычитание (-), умножение (), деление (/), возведение в степень (**), целочисленное деление (DIV) и деление по модулю (MOD). Операнды должны иметь числовой тип (NUMBER, INTEGER или REAL).
Операторы сложения, вычитания, умножения, деления и возведения в степень выполняют одноименные математические операции. За исключением деления, они выдают целочисленный результат, если оба операнда имеют тип данных INTEGER, и результат типа REAL - в остальных случаях [если при этом ни один из операндов не имеет неопределенного (?) значения]. Результатом оператора деления (/) является действительное число [если при этом ни один из операндов не имеет неопределенного (?) значения].
Деление по модулю (MOD) и целочисленное деление (DIV) дают целочисленный результат [если при этом ни один из операндов не имеет неопределенного (?) значения]. Если какой-либо операнд имеет тип данных REAL, то перед выполнением данного оператора его значение преобразуется в значение типа INTEGER усечением, то есть его дробная часть отбрасывается. Для любых целых чисел а и b всегда справедливо равенство (a DIV b)b + c(a MOD b) = а, где c=1 для b>=0 и c=-1 для b<0. Абсолютное значение выражения a MOD b должно быть меньше, чем абсолютное значение b, а знак выражения a MOD b должен совпадать со знаком b.
Если какой-либо из операндов арифметического оператора имеет неопределенное (?) значение, то результат оператора должен иметь неопределенное (?) значение.
Округление действительных чисел.
Когда требуется округление, оно осуществляется с точностью р (либо заданной в явном виде для типа данных REAL, либо определяемой ограничением для конкретной реализации, устанавливаемым в соответствии с приложением Е) по следующему алгоритму:
a) преобразовать представление числа в экспоненциальный формат с удалением всех предшествующих нулей;
b) установить указатель разряда k на р-ю позицию справа от десятичной точки;
c) если действительное число является положительным, то выполняются следующие действия:
- если цифра, расположенная на позиции k, принадлежит к диапазону от 5 до 9, то добавить 1 к цифре, расположенной на позиции k-1, а цифры, начиная с позиции k и далее, отбросить. Перейти к шагу по перечислению e);
- если цифра, расположенная на позиции k, принадлежит к диапазону от 0 до 4, то цифры, начиная с позиции k и далее, отбросить. Перейти к шагу по перечислению h);
d) если действительное число является отрицательным, то выполняются следующие действия:
- если цифра, расположенная на позиции k, принадлежит к диапазону от 6 до 9, то добавить 1 к цифре, расположенной на позиции k-1, а цифры, начиная с позиции k и далее, отбросить. Перейти к шагу по перечислению e);
- если цифра, расположенная на позиции k, принадлежит к диапазону от 0 до 5, то цифры, начиная с позиции k и далее, отбросить. Перейти к шагу по перечислению h);
e) присвоить указателю разряда k значение k-1;
f) если цифра, расположенная на позиции k, принадлежит к диапазону от 0 до 9, то перейти к шагу по перечислению h);
g) если цифра, расположенная на позиции k, имеет значение 10, то добавить 1 к цифре, расположенной на позиции k-1, и установить цифру, расположенную на позиции k, в 0. Перейти к шагу по перечислению e);
h) округление действительного числа завершено.
Примечание - В результате действия данного алгоритма число 0,5 округляется до 1, а число -0,5 округляется до 0.
Пример - Данный пример показывает результат задания числа значащих цифр в дробной части действительного числа, то есть его точности.
LOCAL | |||||
distance | : REAL(6); | ||||
x1, y1, z1 | : REAL; | ||||
x2, y2, z2 | : REAL; | ||||
END_LOCAL; |
Вычисленное значение объекта distance равно 1.9104973...e+1, но, его реальным значением будет 1.91050е+1, поскольку в спецификации данного объекта задана точность, равная шести значащим цифрам, поэтому будут оставлены только шесть значащих цифр.