Разница в остаточных операторах Ады?

Итак, я знаю, что Ада предлагает два оператора остатка, rem и mod, но в чем именно между ними разница? Мне удалось найти это, но я не уверен, что полностью понял разница.


person Analytic Lunatic    schedule 16.11.2013    source источник


Ответы (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.

person ajb    schedule 16.11.2013

Согласно 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) 
person Shark8    schedule 16.11.2013