Итак, я знаю, что Ада предлагает два оператора остатка, rem
и mod
, но в чем именно между ними разница? Мне удалось найти это, но я не уверен, что полностью понял разница.
Разница в остаточных операторах Ады?
Ответы (2)
Нет никакой разницы между A mod B
и A rem B
, если A
неотрицательно, а B
положительно. Если A
отрицательное, а B
положительное, mod
дает вам истинную математическую операцию по модулю; таким образом, например, если B равно 5, вот результаты A mod 5
и A rem 5
для значений A
:
A = -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8
A mod 5 = 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3
A rem 5 = 0 -4 -3 -2 -1 0 -4 -3 -2 -1 0 1 2 3 4 0 1 2 3
Обратите внимание на закономерность в результатах A mod 5
. rem
соответствует тому, как оператор %
работает в языках C-стиля (но, по-видимому, не в Python или Ruby). На некоторых процессорах может быть быстрее. Если вам приходится иметь дело с отрицательными значениями для A
, я предполагаю, что mod
будет гораздо более полезным, но и для rem
могут быть некоторые применения. Я не думаю, что mod
или rem
с отрицательным правым операндом вообще очень полезны, поэтому я бы не слишком беспокоился об определении.
См. также http://en.wikipedia.org/wiki/Modulo_operation.
Согласно LRM, разница какой знак операнда связан с результатом.
Целочисленное деление и остаток определяются соотношением 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)