how c++ modulo divide-by-zero

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

https://www.shadertoy.com/view/MslfW8


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 )