¿Hay alguna razón, histórica o de otro tipo, por la cual el operador de módulo es parte de un pequeño conjunto de operadores estándar en lo que parecen muchos idiomas? ( +, -, *, /
y %
, para Java y C, con **
Ruby y Python).
Parece extraño incluir el mod como "fundamental" (para no tocarlo, lo uso mucho, pero también uso la exponenciación, el valor absoluto, el piso / techo u otros; parecen igual de útiles y necesarios). ¿Fue esta una vieja decisión tomada en alguna especificación que siguen Java, C, Ruby y Python o un lenguaje del que todos descienden? Por lo que puedo decir, la mayoría de los dialectos de Lisp solo incluyen +, -, /
y *
.
Al principio me preguntaba si el mod era particularmente fácil de implementar a nivel binario (¿eso incluso haría una diferencia, con respecto a las decisiones sobre lo que debería ser un operador "fundamental" y lo que no debería ser), pero parece que no lo es. ¿Se usa mucho más comúnmente en programación de lo que creo?
fuente
Muchos lenguajes de programación tienen un operador "restante" que puede usarse como operador de módulo cuando ambos operandos son positivos; dicho operador a menudo se llama el operador de "módulo", porque ese es su uso principal. Los idiomas generalmente tienen dicho operador porque el hardware de división de muchas plataformas de hardware suministra automáticamente un resto al realizar una división, y calcular un resto o módulo por cualquier otro medio sería mucho más difícil.
No conozco la historia del soporte de hardware para la división firmada; muchos procesadores han proporcionado durante años hardware que puede realizar automáticamente la división firmada sujeta a la regla de que si a / b produce (q, r), entonces -a / b o a / -b producirá (-q, -r), pero No estoy seguro de los casos de uso en los que la división que usa esa regla es particularmente útil. En casi todos los casos en los que he usado operaciones de división entera u "módulo" en valores negativos, he querido redondear hacia el infinito negativo en la división y una verdadera operación de módulo (tal que (a + b) / b siempre igual (a / b) +1 y (a + b)% b siempre sería igual a% b.). Debido a que los operadores no funcionan de esa manera, es necesario probar el signo del dividendo y usar un código diferente cuando ' s negativo: esencialmente negar cualquier beneficio de tener una instrucción de división firmada en primer lugar. Tengo curiosidad por saber para qué fines es realmente útil el soporte de división firmada en hardware.
Volviendo a la pregunta original, el operador de módulo a menudo es útil en situaciones donde se supone que suceden ciertas cosas de forma periódica, ya sea en el espacio (por ejemplo, coordenadas gráficas) o en el tiempo. Por ejemplo, si uno quiere que suceda un evento cada 15 segundos, el tiempo hasta el próximo evento será 15 - ((time_now - time_of_an_occurrence)% 15), suponiendo
time_of_an_occurrence
que no sea mayor quetime_now
. Sitime_of_an_occurrence
fuera mayor quetime_now
, un operador de módulo podría continuar usando la misma fórmula siempre que la resta no se desbordara, pero el operador restante requerirá una fórmula diferente.fuente
rem
para el resto ymod
para el módulo con las propiedades que usted describe.m = number % base; if (m < 0) m+=base;
. No sé si alguna vez he visto algún código que se haya beneficiado de que el operador restante se haya vuelto negativo, excepto tal vezq = n/d; if (n%d < 0) q+=1;
, que en cualquier caso podría escribirse mejor de otras maneras.El módulo está estrechamente relacionado con la teoría de grupos y anillos, que son teorías matemáticas muy fundamentales.
La exponenciación es solo la tercera operación en la secuencia de suma, multiplicación, exponenciación, tetración (y esa es una secuencia infinita). Se vuelve importante principalmente con números complejos, que son más raros en aritmética informática. Sin embargo, una exponenciación particular se admite explícitamente: 2 n se escribe comúnmente como
1<<n
, ya que las computadoras son bastante binarias.El piso y el techo son realmente raros en comparación: solo se aplican cuando se convierte de ℝ a ℤ. (coma flotante a entero). Del mismo modo,
abs
se asocia con un mapeo de ℤ a ℕfuente
Lo siento, pero a riesgo de convertir esto en un juego de "Call My Bluff", creo que la respuesta real a esta pregunta es bastante simple:
Mod permite cálculos precisos en cantidades y unidades "no decimales" como fechas, hora, yardas, pulgadas, onzas, etc. En los cálculos decimales, también proporciona un método para que el programador trabaje con una precisión numérica más allá de la proporcionada por el hardware de la máquina. Esto tiene una gran cantidad de aplicaciones desde muy pequeñas (por ejemplo, cálculos cuánticos) hasta muy grandes (por ejemplo, descubriendo nuevos números primos).
Es importante entender que llamamos a estas cosas computadoras por una razón. ¡A veces necesitamos que nos den la respuesta correcta!
fuente