Как работает модуль и почему он отличается в Python от большинства языков? - PullRequest
7 голосов
/ 17 февраля 2012

Ниже некоторый код на C ++ .Если вы попробуете что-то вроде -2%5 в python, результат будет положительным 3, тогда как многие другие языки, такие как c ++ C # ( code ) и flash, дают -2

Почему они дают -2одна версия более правильная, чем другая?

#include <cstdio>
int main(){
printf("%d\n", 2%5);
printf("%d\n", -2%5);
printf("%d\n", -2%77);
printf("%d\n", 2%-77);
printf("%d\n", -2%-77);
}

Вывод:

2
-2
-2
2
-2

Ответы [ 3 ]

7 голосов
/ 17 февраля 2012

Если r = a % n, то a = n * q + r для некоторых q. Это означает, что у вас есть много вариантов значения r, в зависимости от выбранного значения q.

Я бы порекомендовал прочитать http://en.wikipedia.org/wiki/Modulo_operation,, в котором говорится, что большинство языков программирования выбирают r с -n < r < n. Это означает, что, если r не равно нулю, у вас есть два варианта значения r - один положительный, другой отрицательный. Разные языки программирования принимают разные решения о том, выбрать ли положительный или отрицательный. На этой странице вы найдете таблицу, в которой обобщено, что делают разные языки:

  • Python выбирает r с тем же знаком, что и n (это то, что вы видите выше).
  • C ++ 2011 выбирает r с тем же знаком, что и a (и до стандарта 2011 года его реализация определяется).

Если вы хотите быть уверенным, что вы получили положительный результат в Python, используйте это:

r = a % n
if r < 0:
  r += n
2 голосов
/ 17 февраля 2012

Согласно документации C ++ :

Для отрицательных значений результат может отличаться в зависимости от реализации библиотеки.

Что странно. Документация Python говорит только об этом:

Оператор по модулю всегда дает результат с тем же знаком, что и его второй операнд (или ноль); абсолютное значение результата строго меньше, чем абсолютное значение второго операнда.

мне кажется , что путь Python более логичен, но это просто внутреннее чувство.

0 голосов
/ 17 февраля 2012

Я думаю, вы должны посмотреть на ниже. Помимо использования немного разных алгоритмов, приоритет имеет оператор. Попробуйте с помощью скобок:

In [170]: 2%5
Out[170]: 2

In [171]: -2%5
Out[171]: 3

In [172]: (-2)%5
Out[172]: 3

In [173]: -(2%5)
Out[173]: -2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...