Знам, че Ada предлага два оператора за остатък, rem
и mod
, но каква точно е разликата между тях? Успях да намеря това, но не съм сигурен, че разбирам напълно разлика.
Разлика в операторите за остатък на Ada?
Отговори (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)