No parece haber una confusión común entre los términos "módulo" y "resto".
En matemáticas, un resto debe siempre ser definido de conformidad con el cociente, por lo que si a/b == c rem d
continuación (c * b) + d == a
. Dependiendo de cómo redondee su cociente, obtiene diferentes remanentes.
Sin embargo, módulo siempre debe dar un resultado 0 <= r < divisor
, que solo es coherente con la división de redondeo a infinito si se permiten enteros negativos. Si la división se redondea hacia cero (lo cual es común), módulo y resto solo son equivalentes para valores no negativos.
Algunos lenguajes (notablemente C y C++) no definen los comportamientos de redondeo/resto requeridos y %
es ambiguo. Muchos definen el redondeo como hacia cero, aunque usan el término módulo donde el resto sería más correcto. Python es relativamente inusual en cuanto redondea al infinito negativo, por lo que el módulo y el resto son equivalentes.
Ada redondea a cero IIRC, pero tiene los operadores mod
y rem
.
La política C tiene como objetivo permitir a los compiladores elegir la implementación más eficiente para la máquina, pero IMO es una optimización falsa, al menos en estos días. Un buen compilador probablemente podrá usar la equivalencia para la optimización dondequiera que un número negativo no pueda ocurrir (y casi seguramente si usa tipos sin firmar). Por otro lado, donde pueden ocurrir números negativos, es casi seguro que se preocupan por los detalles; por razones de portabilidad, debe usar algoritmos y/o controles overcomplex cuidadosamente diseñados para asegurarse de obtener los resultados que desea, independientemente del redondeo y el resto comportamiento.
En otras palabras, la ganancia para esta "optimización" es mayormente (si no siempre) una ilusión, mientras que en algunos casos hay costos muy reales, por lo que es una optimización falsa.
Puede usar 'math.fmod' para obtener el mismo comportamiento que en C o Java. – Helio