Разлика в операторите за остатък на Ada?

Знам, че Ada предлага два оператора за остатък, 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