2012-02-17 9 views
7

Di seguito è some code in C++. Se provi qualcosa come -2%5 in python il risultato è positivo 3 mentre molti altri linguaggi come C++ C# (code) e flash danno -2Come funziona il modulo e perché è diverso in Python rispetto alla maggior parte delle lingue?

Perché danno -2 ed è una versione più corretta dell'altra?

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

uscita:

2 
-2 
-2 
2 
-2 

risposta

-1

Credo che si dovrebbe guardare al di sotto. Oltre a utilizzare algoritmi leggermente diversi, la precedenza degli operatori è importante. Provalo con staffe:

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

Secondo il C++ documentation:

Per valori negativi, il risultato può variare a seconda dell'implementazione biblioteca.

Quale sembra strano. Il Python documentation dice solo questo:

L'operatore modulo produce sempre un risultato con lo stesso segno del suo secondo operando (o zero); il valore assoluto del risultato è strettamente inferiore al valore assoluto del secondo operando.

E sembra per me che il modo in cui Python è più logico, ma questo è solo una sensazione viscerale.

+1

E 'implementazione definita in C++ 98 (e C-90). È ben definito in C++ 11 (e C-99): il segno del risultato dell'operatore modulo è lo stesso del segno del dividendo. In Python, il risultato ha lo stesso segno del divisore. Quale modo di interpretare le cose è un po 'un lancio di moneta.Ciò che ha più senso per me sono i linguaggi che forniscono entrambe le implementazioni, così come il programmatore può scegliere quello che ha più senso in qualche contesto particolare. –

7

Se r = a % n, quindi a = n * q + r per alcuni q. Ciò significa che hai molte scelte per il valore di r, a seconda del valore di q che viene scelto.

Si consiglia di leggere http://en.wikipedia.org/wiki/Modulo_operation, che indica che la maggior parte dei linguaggi di programmazione sceglie r con -n < r < n. Ciò significa che, a meno che r sia zero, hai due scelte per il valore di r - una positiva, una negativa. Diversi linguaggi di programmazione prendono decisioni diverse sull'opportunità di prendere quello positivo o negativo. Troverete una tabella a quella pagina che riassume ciò che fanno diversi linguaggi:

  • Python sceglie r con lo stesso segno di n (che è quello che vedete qui sopra).
  • C++ 2011 sceglie r con lo stesso segno di a (e prima dello standard 2011, è definito l'implementazione).

Se si vuole essere sicuri che si ottiene quello positivo in Python, utilizzare questo:

r = a % n 
if r < 0: 
    r += n 
Problemi correlati