Из отчета Haskell:
Методы класса quot, rem, div и mod удовлетворяют этим законам, если y не равен нулю:
(x `quot` y)*y + (x `rem` y) == x (x `div` y)*y + (x `mod` y) == x
quot
представляет собой целочисленное деление, усеченное в сторону нуля, а результатdiv
усекается в сторону отрицательной бесконечности.
Например:
Prelude> (-12) `quot` 5
-2
Prelude> (-12) `div` 5
-3
Каковы некоторые примеры того, где разница между тем, как усекается результат, имеет значение?
mod
следует за знаком второго операнда. 07.05.2009(q,r) = divMod x y
тогда и только тогда, когдаx = q*y + r
. Запустите пример, это умно, как это работает. 17.12.2010divMod 11 (-5) = (-2, 1)
(вместо (-3,-4)), у вас все равно будет 11 = (-2)*(-5) + 1. Таким образом, ваше условие не заставляет знакmod
следовать за вторым операндом. Кстати, свойствоx=q*y+r
всегда верно и для quotRem, и всегда существует бесконечно много пар (q,r) таких, чтоx=q*y+r
(и ровно две из этих пар имеют |r|‹q, за исключением случаев, когда r=0 дает решение есть только одна пара). 17.12.2010mod
компенсирует какое-то связанное дизайнерское решение вdiv
? Точно сказать не могу... 17.12.2010