Saltar al contenido

Diferencia entre `mod` y `rem` en Haskell

La guía o código que hallarás en este post es la resolución más sencilla y válida que encontramos a tu duda o dilema.

Solución:

No son lo mismo cuando el segundo argumento es negativo:

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

Sí, esas funciones actúan de manera diferente. Como se define en la documentación oficial:

quot es la división entera truncada hacia cero

rem es un resto entero, que satisface:

(x `quot` y)*y + (x `rem` y) == x

div es la división entera truncada hacia el infinito negativo

mod es módulo entero, satisfaciendo:

(x `div` y)*y + (x `mod` y) == x

Realmente puedes notar la diferencia cuando usas un número negativo como segundo parámetro y el resultado no es cero:

5 `mod` 3 == 2
5 `rem` 3 == 2

5 `mod` (-3) == -1
5 `rem` (-3) == 2

(-5) `mod` 3 == 1
(-5) `rem` 3 == -2

(-5) `mod` (-3) == -2
(-5) `rem` (-3) == -2

Hablando practicamente:

Si sabe que ambos operandos son positivos, generalmente debe usar quot, remo quotRem para la eficiencia.

Si no sabe que ambos operandos son positivos, debe pensar en cómo quiere que se vean los resultados. probablemente no quieras quotRempero es posible que no quieras divMod o. los (x `div` y)*y + (x `mod` y) == x La ley es muy buena, pero redondear la división hacia el infinito negativo (división al estilo de Knuth) suele ser menos útil y menos eficiente que asegurar que 0 <= x `mod` y < y (División euclidiana).

Si entiendes que ha sido de ayuda nuestro artículo, agradeceríamos que lo compartas con el resto desarrolladores y nos ayudes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *