¿No puede Mod Zero?

¿Por qué? X % 0 ¿Una expresión inválida?

Siempre pensé X % 0 debe igual X. Ya que no puedes dividir por cero, ¿no debería la respuesta naturalmente ser el resto, X (todo lo que queda por encima)?

Pregunta hecha hace 12 años, 5 meses, 18 días - Por Kairo


11 Respuestas:

  • El estándar C++(2003) dice en §5.6/4,

    [...] Si el segundo operand de / o % es cero el comportamiento es indefinidos; [...]

    Es decir, después de las expresiones invocan comportamiento indefinido(UB):

    X / 0; //UB
    X % 0; //UB
    

    Note also that -5 % 2 NO es igual a -(5 % 2) (como Petar parece sugerir en su comentario a su respuesta). Está definido en la implementación. La especificaciones dice (§5.6/4),

    [...] Si ambos operandos no son negativos entonces el resto no es negativo; si no, la señal del resto está definida por la aplicación.

    Respondida el Sep 10, 2011 a las 07:04 - por syntaxsculptor

    Votos positivos: 0 | Votos negativos: 0

  • Esta respuesta no es para el matemático. Esta respuesta intenta dar motivación (a costa de precisión matemática).

    Matemáticos: Mira aquí.

    Programadores: Recuerda esa división por 0 es undefined. Por lo tanto, mod, que depende de la división, también es undefined.


    Esto representa la división para positivo X y D; está compuesto por la parte integral y parte fraccional:

    (X / D) =   integer    +  fraction
            = floor(X / D) + (X % D) / D
    

    Reordenando, usted consigue:

    (X % D) = D * (X / D) - D * floor(X / D)
    

    Sustitución 0 para D:

    (X % 0) = 0 * (X / 0) - 0 * floor(X / 0)
    

    Desde la división 0 es undefined:

    (X % 0) = 0 * undefined - 0 * floor(undefined)
            = undefined - undefined
            = undefined
    

    Respondida el Sep 10, 2011 a las 07:12 - por techwizkid

    Votos positivos: 0 | Votos negativos: 0

  • X % D es por definición Número 0 <= R < D, tal que existe Q así

    X = D*Q + R
    

    Así que si D = 0, no existe tal número (porque 0 <= R < 0)

    Respondida el Sep 10, 2011 a las 07:18 - por debugdynamob312

    Votos positivos: 0 | Votos negativos: 0

  • Creo que porque conseguir el resto de X % 0 tienes que calcular primero X / 0 que produce el 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 así

    REMAIN = Y ? X % Y : X
    

    Respondida el Sep 10, 2011 a las 07:28 - por codechampion

    Votos positivos: 0 | Votos negativos: 0

  • Otra manera que podría ser conceptualmente fácil de entender el tema:

    Ignorando por el momento la cuestión del argumento firme, a % b podría ser fácilmente reescrito como a - ((a / b) * b). La expresión a / b es indefinido b es cero, así que en ese caso la expresión general debe ser también.

    Al final, el módulo es efectivamente una operación divisiva, así que si a / b no está definido, no es irrazonable esperar a % b para ser también.

    Respondida el Sep 10, 2011 a las 07:38 - por algorithmadept

    Votos positivos: 0 | Votos negativos: 0

  • X % Y da un resultado en el entero [ 0, Y ) rango. X % 0 tendría que dar un resultado mayor o igual a cero, y menos que cero.

    Respondida el Sep 10, 2011 a las 07:48 - por geekglitcher

    Votos positivos: 0 | Votos negativos: 0

  • puede evadir el caso "divivión por 0" de (A%B) por su tipo de identidad flotante mod(a,b) para flotador(B)=b=0.0 , que es indefinido, o definido de manera diferente entre cualquier 2 implementaciones, para evitar errores lógicos (fallos duros) a favor de errores aritméticos...

    por computación mod([a*b],[b])==b*(a-floor(a))
    INSTREAD OF
    computación mod([a],[b])

    donde [a*b]= tu eje x, con el tiempo [b] == el máximo de la curva de sierra (que nunca se alcanzará) == el primer derivado de la función de sierra

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

    Respondida el Sep 10, 2011 a las 07:55 - por phpphoenix

    Votos positivos: 0 | Votos negativos: 0

  • Supongo que porque para obtener el resto del X % 0 necesitas calcular primero X / 0 que produce 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 así,

    ans = Y ? X % Y : X
    

    También, en C++ docs su escrito que X % 0 o X / 0,resulta en un valor indefinido.

    Respondida el Sep 10, 2011 a las 08:05 - por quantumcoder403a

    Votos positivos: 0 | Votos negativos: 0

  • Cómo se dividen las computadoras:

    Comience con el dividendo y reste el divisor hasta que el resultado sea menos entonces el divisor. El número de veces que se resta es el resultado y lo que queda es el resto. Por ejemplo, dividir 10 y 3:

    10 - 3 = 7
    7 - 3 = 4
    4 - 3 = 1
    

    Así que...

    10 / 3 = 3
    10 % 3 = 1
    

    Para dividir 1 y 0:

    1 / 0
    1 - 0 = 1  
    1 - 0 = 1  
    1 - 0 = 1  
    ...
    

    Así que...

    1 / 0 = Infinity (technically even infinity is too small, but it's easy to classify it as that)
    1 % 0 = NaN
    

    Si no hay nada que detenerlo, la CPU continuará ejecutando esto hasta que sobrecarga y devuelve un resultado totalmente aleatorio. Así que hay una instrucción en el nivel de CPU que si el divisor es 0, retorno NaN o Infinity (dependiendo de su plataforma).

    Esto nunca terminará así que el resto es indefinido (lo cual es NaN para ordenadores).

    Respondida el Sep 10, 2011 a las 08:10 - por pixelpioneerc4b5

    Votos positivos: 0 | Votos negativos: 0

  • Intentar realizar la operación módulo (%) con cero en el denominador no es posible en matemáticas (y en la mayoría de los lenguajes de programación), ya que la división por cero no está definida y conduce a un error.

    En términos de operaciones aritméticas, la operación módulo (%) se define como el resto de la división entera. Por lo tanto, al intentar hacer X % 0, no hay forma de realizar una división por cero para obtener un resto, ya que la división por cero no está definida y causa una indeterminación matemática.

    En resumen, intentar realizar la operación X % 0 resultará en un error en la mayoría de los contextos. Siempre asegúrate de evitar hacer operaciones aritméticas que puedan resultar en división por cero, ya que es una operación indefinida.

    Respondida el Sep 11, 2011 a las 07:05 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El operador módulo (%) devuelve el resto de la división entera. Cuando divides un número por cero, el resultado es indefinido, no cero. Por lo tanto, no está definido qué resto se obtendría de dividir un número por cero. Es por eso que la expresión X % 0 es inválida.

    Ejemplo:

    
    5 % 2 = 1 (el resto de dividir 5 entre 2 es 1)
    5 % 0 = indefinido (no está definido qué resto se obtiene al dividir 5 entre 0)
    

    Algunos lenguajes de programación, como Python, generan un error cuando intentas realizar una operación módulo por cero. Otros lenguajes, como C++, pueden generar resultados inesperados o indefinidos.

    Es importante recordar que la división por cero no está definida en matemáticas y, por lo tanto, tampoco está definida en programación.

    Respondida el Sep 11, 2011 a las 07:14 - por Gemini

    Votos positivos: 0 | Votos negativos: 0