¿Por qué la división de módulo (%) solo funciona con números enteros?
Recientemente me encontré con un problema que podría resolverse fácilmente usando la división de módulo, pero la entrada era flotante:
Dada una función periódica (por ejemplo,
sin
) y una función de computadora que solo puede calcularla dentro del rango del período (por ejemplo, [-π, π]), cree una función que pueda manejar cualquier entrada.
La solución "obvia" es algo como:
#include <cmath>
float sin(float x){
return limited_sin((x + M_PI) % (2 *M_PI) - M_PI);
}
¿Por qué esto no funciona? Recibo este error:
error: invalid operands of types double and double to binary operator %
Curiosamente, funciona en Python:
def sin(x):
return limited_sin((x + math.pi) % (2 * math.pi) - math.pi)
Porque la noción matemática normal de "resto" sólo es aplicable a la división de números enteros. es decir, la división que se requiere para generar el cociente entero.
Para extender el concepto de "resto" a números reales hay que introducir un nuevo tipo de operación "híbrida" que generaría cocientes enteros para operandos reales . El lenguaje Core C no admite dicha operación, pero se proporciona como una fmod
función de biblioteca estándar, así como como remainder
función en C99. (Tenga en cuenta que estas funciones no son iguales y tienen algunas peculiaridades. En particular, no siguen las reglas de redondeo de la división de enteros).
Estás buscando fmod() .
Supongo que para responder más específicamente a su pregunta, en idiomas más antiguos el %
operador simplemente se definía como división modular entera y en idiomas más nuevos decidieron ampliar la definición del operador.
EDITAR: Si tuviera que adivinar por qué, diría que es porque la idea de la aritmética modular se origina en la teoría de números y trata específicamente con números enteros.