Почему модуль определяется так, как в языках программирования - PullRequest
5 голосов
/ 17 сентября 2011

Я спрашиваю не об определении, а о том, почему создатели языка решили определять модуль с асимметричным поведением в C ++.(Я думаю, что Java тоже)

Предположим, я хочу найти наименьшее число, большее или равное n, которое делится на f.

Если n положительно, то я делаю:

if(n % f)
   ans = n + f - n % f;

Если n отрицательно:

ans = n - n % f;

Очевидно, что это определение не является наиболее целесообразным при работе с отрицательными и положительными числами.Итак, почему это было определено как это?В каком случае это дает целесообразность?

Ответы [ 2 ]

1 голос
/ 17 сентября 2011

Вы ошибаетесь.Когда n является отрицательным, C ++ позволяет результату оператора модуля быть либо отрицательным, либо положительным, если результаты из % и / согласуются, поэтому для любых заданных a и bвыражение (a/b)*b + a%b всегда будет давать a.C99 требует, чтобы результат a % b имел тот же знак, что и a.Некоторые другие языки (например, Python) требуют, чтобы знак a % b имел тот же знак, что и b.

Это означает, что выражение, которое вы дали для отрицательного n, фактически не требуется для работыв C ++.Когда / если n%f дает положительное число (даже если n отрицательно), это даст ans, что меньше n.

1 голос
/ 17 сентября 2011

Поскольку используется «арифметика по модулю 2», где каждая двоичная цифра обрабатывается независимо от другой. Посмотрите на пример "деления" здесь

...