¿Por qué la división de módulo (%) solo funciona con números enteros?

Resuelto Brendan Long asked hace 13 años • 9 respuestas

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)
Brendan Long avatar May 24 '11 03:05 Brendan Long
Aceptado

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 fmodfunción de biblioteca estándar, así como como remainderfunció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).

AnT stands with Russia avatar May 23 '2011 21:05 AnT stands with Russia

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.

Doug Stephen avatar May 23 '2011 21:05 Doug Stephen