c++ - how to put mod in c
Can not Mod Zero? (7)
¿Por qué X % 0
una expresión inválida?
Siempre pensé que X % 0
debería ser igual a X. Dado que no puedes dividir por cero, ¿no debería la respuesta ser naturalmente el resto, X (todo sobrante)?
Creo que para obtener el resto de X % 0
primero debe calcular X / 0
que arroja infinito, y tratar de calcular el resto del infinito no es realmente posible.
Sin embargo, la mejor solución en línea con su pensamiento sería hacer algo como esto
REMAIN = Y ? X % Y : X
El estándar C ++ (2003) dice en §5.6 / 4,
[...] Si el segundo operando de / o% es cero, el comportamiento no está definido ; [...]
Es decir, las siguientes expresiones invocan comportamiento indefinido (UB):
X / 0; //UB
X % 0; //UB
Tenga en cuenta también que -5 % 2
NO es igual a -(5 % 2)
(como Petar parece sugerir en su comentario a su respuesta). Está definido por la implementación. La especificación dice (§5.6 / 4),
[...] Si ambos operandos son no negativos, el resto no es negativo; si no, el signo del resto está definido por la implementación .
Esta respuesta no es para el matemático. Esta respuesta intenta dar motivación (a costa de la precisión matemática).
Matemáticos: mira aquí.
Programadores: recuerde que la división por 0
undefined
está undefined
. Por lo tanto, mod
, que se basa en la división, tampoco está undefined
.
Esto representa la división para X
y D
positivos; está compuesto por la parte integral y la parte fraccionaria:
(X / D) = integer + fraction
= floor(X / D) + (X % D) / D
Reordenando, obtienes:
(X % D) = D * (X / D) - D * floor(X / D)
Sustituyendo 0
por D
:
(X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
Dado que la división por 0
undefined
está undefined
:
(X % 0) = 0 * undefined - 0 * floor(undefined)
= undefined - undefined
= undefined
Otra forma que podría ser conceptualmente fácil de entender el problema:
Ignorando por el momento la cuestión del signo del argumento, a % b
podría reescribirse fácilmente como a - ((a / b) * b)
. La expresión a / b
no está definida si b
es cero, por lo que en ese caso la expresión general debe ser también.
Al final, el módulo es efectivamente una operación divisiva, por lo que si a / b
no está definido, no es irrazonable esperar que también lo sea a % b
.
X% Y da un resultado en el rango entero [0, Y). X% 0 debería dar un resultado mayor o igual a cero y menor que cero.
puede evadir el caso "divivion by 0" de (A% B) para su tipo de identidad flotante (a, b) para float (B) = b = 0.0, que no está definido, o se define de manera diferente entre cualquier 2 implementaciones, para evitar errores de lógica (bloqueos intensos) a favor de errores aritméticos ...
calculando mod([a*b],[b])==b*(a-floor(a))
INSTREAD OF
computación mod([a],[b])
donde [a * b] == su eje x, con el tiempo [b] == el máximo de la curva de balancín (que nunca se alcanzará) == la primera derivada de la función de balancín
X % D
es por definición un número 0 <= R < D
, tal que existe Q
modo que
X = D*Q + R
Entonces, si D = 0
, no puede existir ese número (porque 0 <= R < 0
)