在Haskell中,mod
和rem
到底有什么不同?
两者似乎给出了相同的结果
*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
发布于 2011-05-05 07:54:21
当第二个参数为负时,它们是不同的:
2 `mod` (-3) == -1
2 `rem` (-3) == 2
发布于 2015-01-19 22:46:54
是的,这些函数的作用是不同的。如official documentation中所定义
quot
是向零截断的整数除法
rem
是整数余数,满足:
(x `quot` y)*y + (x `rem` y) == x
div
是向负无穷大截断的整数除法
mod
是整数模,满足:
(x `div` y)*y + (x `mod` y) == x
当您使用负数作为第二个参数并且结果不为零时,您可以真正注意到不同之处:
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
发布于 2015-01-19 23:14:28
实话实说:
如果您知道两个操作数都为正,则通常应使用quot
、rem
或quotRem
来提高效率。
如果你不知道两个操作数都是正的,你必须考虑你想要的结果是什么样子。您可能不想要quotRem
,但也可能不想要divMod
。(x `div` y)*y + (x `mod` y) == x
法则是一个非常好的法则,但是将除法舍入到负无穷大(Knuth风格除法)通常比确保0 <= x `mod` y < y
(欧几里得除法)用处更小,效率也更低。
https://stackoverflow.com/questions/5891140
复制相似问题