2012-02-17 8 views
7

A continuación se some code in C++. Si intenta algo así como -2%5 en python el resultado es positivo 3, mientras que muchos otros lenguajes como C++ C# (code) y flash dan -2¿Cómo funciona el módulo y por qué es diferente en Python que la mayoría de las lenguas?

¿Por qué dan -2 y es una versión más correcto que el otro?

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

Salida:

2 
-2 
-2 
2 
-2 

Respuesta

-1

Creo que usted debe buscar en el siguiente. Además de utilizar algoritmos ligeramente diferentes, la precedencia del operador importa. Prueba con paréntesis:

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

De acuerdo con el C++ documentation:

Para valores negativos, el resultado puede variar dependiendo de la implementación de la biblioteca.

que parece extraño. El Python documentation dice sólo esto:

El operador módulo siempre produce un resultado con el mismo signo que su segundo operando (o cero); el valor absoluto del resultado es estrictamente menor que el valor absoluto del segundo operando.

Se parece para mí que la forma en Python es más lógico, pero eso es sólo una primera impresión.

+1

Se define la implementación en C++ 98 (C-90). Está bien definido en C++ 11 (y C-99): el signo del resultado del operador de módulo es el mismo que el signo del dividendo. En Python, el resultado tiene el mismo signo que el divisor. Qué manera de interpretar las cosas es como tirar una moneda.Lo que tiene más sentido para mí son los lenguajes que proporcionan ambas implementaciones, así que como programador puedo elegir el que tenga más sentido en un contexto particular. –

7

Si r = a % n, entonces a = n * q + r para unos q. Eso significa que tiene muchas opciones para el valor de r, según el valor de q que se elija.

Recomiendo leer http://en.wikipedia.org/wiki/Modulo_operation, que dice que la mayoría de los lenguajes de programación eligen r con -n < r < n. Eso significa que, a menos que r sea cero, tiene dos opciones para el valor de r - una positiva, una negativa. Los diferentes lenguajes de programación toman diferentes decisiones sobre si tomar el positivo o el negativo. Encontrará una tabla en la que la página que resume lo hacen diferentes idiomas:

  • Python elige r con el mismo signo que n (que es lo que se ve arriba).
  • C++ 2011 elige r con el mismo signo que a (y antes del estándar 2011, su implementación está definida).

Si usted quiere estar seguro de que obtendrá el positivo en Python, utilice esto:

r = a % n 
if r < 0: 
    r += n 
Cuestiones relacionadas