Quelle est exactement la différence entre mod
et rem
dans Haskell?
Les deux semblent donner les mêmes résultats
*Main> mod 2 3
2
*Main> rem 2 3
2
*Main> mod 10 5
0
*Main> rem 10 5
0
*Main> mod 1 0
*** Exception: divide by zero
*Main> rem 1 0
*** Exception: divide by zero
*Main> mod 1 (-1)
0
*Main> rem 1 (-1)
0
mod
ulus ==rem
ainder.div
etquot
Réponses:
Ils ne sont pas les mêmes lorsque le deuxième argument est négatif:
la source
rem
etmod
dans Clojure, et c'était la réponse.rem
c'est le plus rapide.Oui, ces fonctions agissent différemment. Tel que défini dans la documentation officielle :
quot
est une division entière tronquée vers zérorem
est un reste entier, satisfaisant:div
est la division entière tronquée vers l'infini négatifmod
est le module entier, satisfaisant:Vous pouvez vraiment remarquer la différence lorsque vous utilisez un nombre négatif comme deuxième paramètre et que le résultat n'est pas zéro:
la source
mod
etrem
associez plus fortement que(-)
. J'ai modifié votre commentaire car je n'arrive pas à mettre des éléments sur plusieurs lignes dans ce commentaire.(-5) `mod` 3 == 1
Pratiquement parlant:
Si vous connaissez les deux opérandes sont positifs, vous devez utiliser habituellement
quot
,rem
ou l'quotRem
efficacité.Si vous ne savez pas que les deux opérandes sont positifs, vous devez réfléchir à ce à quoi vous voulez que les résultats ressemblent. Vous ne voulez probablement pas
quotRem
, mais vous ne voulez peut-être pas nondivMod
plus. La(x `div` y)*y + (x `mod` y) == x
loi est très bonne, mais arrondir la division vers l'infini négatif (division de style Knuth) est souvent moins utile et moins efficace que d'assurer cela0 <= x `mod` y < y
(division euclidienne).la source
Si vous souhaitez uniquement tester la divisibilité, vous devez toujours utiliser
rem
.Équivaut essentiellement
x `mod` y == 0
àx `rem` y == 0
, maisrem
est plus rapide quemod
.la source