2012-02-17 12 views
7

Poniżej znajduje się some code in C++. Jeśli spróbujesz coś takiego, jak -2%5 w pythonie, wynik będzie dodatni 3, podczas gdy wiele innych języków, takich jak C++ C# (code) i flash da -2Jak działa modulus i dlaczego jest inny w Pythonie niż w większości języków?

Dlaczego dają -2 i czy jedna wersja jest bardziej poprawna od drugiej?

#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); 
} 

wyjściowa:

2 
-2 
-2 
2 
-2 

Odpowiedz

-1

Myślę, że należy spojrzeć na poniższy. Oprócz stosowania nieco innych algorytmów ważniejsze jest pierwszeństwo operatorów. Spróbuj z nawiasami:

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 
2

Według C++ documentation:

dla wartości ujemnych, wynik może się różnić w zależności od implementacji biblioteki.

Co wydaje się dziwne. Python documentation mówi tylko to:

Operator modulo zawsze daje wynik z tym samym znakiem, co jego drugi operand (lub zero); bezwzględna wartość wyniku jest ściśle mniejsza niż bezwzględna wartość drugiego argumentu.

To wydaje mi się, że sposób Python jest bardziej logiczne, ale to tylko przeczucie.

+1

Jest wdrożenie zdefiniowane w C++ 98 (i C-90). Jest dobrze zdefiniowany w C++ 11 (i C-99): Znak wyniku operatora modulus jest taki sam jak znak dywidendy. W języku Python wynik ma taki sam znak jak dzielnik. Który sposób interpretowania rzeczy to trochę rzut monetą.Dla mnie najbardziej sensowne są języki, które zapewniają obydwie implementacje, więc jako programista mogę wybrać ten, który ma więcej sensu w konkretnym kontekście. –

7

Jeśli r = a % n, to a = n * q + r dla niektórych q. Oznacza to, że masz wiele możliwości wyboru wartości r, w zależności od wartości, która zostanie wybrana jako q.

Polecam lekturę http://en.wikipedia.org/wiki/Modulo_operation, która mówi, że większość języków programowania wybiera r z -n < r < n. Oznacza to, że jeśli r ma wartość zero, masz dwie możliwości dla wartości r - jedna pozytywna, jedna negatywna. Różne języki programowania podejmują różne decyzje dotyczące tego, czy przyjąć pozytywne czy negatywne. Znajdziesz stolik na tej stronie, który podsumowuje to, co zrobić różnych językach:

  • Python wybiera r z tego samego znaku jako n (czyli to, co widać powyżej).
  • C++ 2011 wybiera r z tym samym znakiem, co a (i przed standardem 2011, jego implementacja jest zdefiniowana).

Jeśli chcesz mieć pewność, że masz pozytywne w Pythonie, użyj tego:

r = a % n 
if r < 0: 
    r += n 
Powiązane problemy