Spec-Zone.ru › Ada 95
Справочник по Ada 95

4.5.5 Операторы умножения

Статическая семантика

Операторы умножения * (умножение), / (деление), mod (модуль) и rem (остаток от деления) определены для каждого целочисленного типа T:
function "*" (Left, Right : T) return T
function "/" (Left, Right : T) return T
function "mod"(Left, Right : T) return T
function "rem"(Left, Right : T) return T
Умножение целых со знаком имеет стандартное значение.
Целочисленное деление и остаток от деления со знаком определяются соотношением:
A = (A/B)*B + (A rem B)
где (A rem B) имеет знак A и абсолютное значение меньше абсолютного значения B. Целочисленное деление со знаком удовлетворяет тождеству:
(-A)/B = -(A/B) = A/(-B)
Оператор модуля целых со знаком определяется таким образом, что результат A mod B имеет знак B и абсолютное значение меньше абсолютного значения B; кроме того, для некоторого целого значения N это значение удовлетворяет соотношению:
A = B*N + (A mod B)
Операторы умножения на типах с модулем определяются через соответствующие операторы целых со знаком, за которым следует приведение по модулю, если результат находится за пределами базового диапазона типа (что возможно только для оператора "*").
Операторы умножения и деления определены для каждого вещественного типа T:
function "*"(Left, Right : T) return T
function "/"(Left, Right : T) return T
Следующие операторы умножения и деления с операндом предопределённого типа Integer определены для каждого конкретного типа с фиксированной точкой T:
function "*"(Left : T; Right : Integer) return T
function "*"(Left : Integer; Right : T) return T
function "/"(Left : T; Right : Integer) return T
Все вышеперечисленные операторы умножения могут использоваться с операндом соответствующего универсального числового типа. Следующие дополнительные операторы умножения для root_real предопределены и могут использоваться, когда оба операнда являются соответствующим универсальным или корневым числовым типом, а результат может быть типа root_real, как в number_declaration:
function "*"(Left, Right : root_real) return root_real
function "/"(Left, Right : root_real) return root_real
function "*"(Left : root_real; Right : root_integer) return root_real
function "*"(Left : root_integer; Right : root_real) return root_real
function "/"(Left : root_real; Right : root_integer) return root_real
Умножение и деление между любыми двумя типами с фиксированной точкой предоставляются следующими двумя предопределёнными операторами:
function "*"(Left, Right : universal_fixed) return universal_fixed
function "/"(Left, Right : universal_fixed) return universal_fixed

Правила допустимости

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

Динамическая семантика

Операторы умножения и деления для вещественных типов имеют стандартное значение. Для типов с плавающей точкой точность результата определяется точностью типа результата. Для типов с фиксированной точкой десятичного типа результат усекается к нулю, если математический результат находится между двумя кратными small конкретного типа результата (возможно, определяется контекстом); для обычных типов с фиксированной точкой, если математический результат находится между двумя кратными small, то неявно определяется, какой из двух является результатом.
Исключение Constraint_Error возникает при целочисленном делении, rem и mod, если правым операндом является ноль. Аналогично, для вещественного типа T с T'Machine_Overflows True деление на ноль вызывает Constraint_Error.
ПРИМЕЧАНИЯ
17 Для положительных A и B, A/B — это частное, а A rem B — остаток при делении A на B. Следующие соотношения выполняются для оператора rem:
A rem (-B) = A rem B
(-A) rem B = -(A rem B)
18 Для любого целого K со знаком выполняется следующее тождество:
A mod B = (A + K*B) mod B
Взаимоотношения между целочисленным делением со знаком, остатком от деления и модулем проиллюстрированы в следующей таблице:
A B A/B A rem B A mod B A B A/B A rem B 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
A B A/B A rem B A mod B A B A/B A rem B A mod B

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

Примеры

Примеры выражений, включающих операторы умножения:
I : Integer := 1;
J : Integer := 2;
K : Integer := 3;
X : Real := 1.0; -- см. 3.5.7
Y : Real := 2.0;
F : Fraction := 0.25; -- см. 3.5.9
G : Fraction := 0.5;
Выражение Значение Тип результата

I*J 2 тот же, что I и J, то есть Integer
K/J 1 тот же, что K и J, то есть Integer
K mod J 1 тот же, что K и J, то есть Integer

X/Y 0.5 тот же, что X и Y, то есть Real
F/2 0.125 тот же, что F, то есть Fraction

3*F 0.75 тот же, что F, то есть Fraction
0.75*G 0.375 universal_fixed, неявное преобразование
в любой тип с фиксированной точкой
Fraction(F*G) 0.125 Fraction, как указано преобразованием
Real(J)*Y 4.0 Real, тип обоих операндов после
преобразования J


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API