Difference between `mod` and `rem` in Haskell
haskell的mod和rem到底有什么区别?
两个结果似乎都一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| *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 |
- 不知道哈斯克尔,但可能是同一个手术。modulus==remainder.
- 公平地说,这不是同一个问题。另一个问题假定理解了这个问题的答案。
- @丹读了那个问题,因为我有另一个问题(stackoverflow.com/questions/5892188/…),我意识到了同样的问题:/
- 这与div和quot的区别相同。
当第二个论点是否定的时候,它们就不一样了:
1 2
| 2 ` mod` (-3) == -1
2 ` rem` (-3) == 2 |
- 我对clojure的rem和mod也有同样的问题,这就是答案。
- 当第一个论点是否定的时候,它们也不相同。有关这些棘手操作的更多信息,请参阅stackoverflow.com/a/8111203/1535283和stackoverflow.com/a/339823/1535283。
- 同样,从stackoverflow.com/a/6964760/205521看来,rem是最快的。
- 虽然这个答案是正确的,但对于一个问题"有什么区别"来说,一个声称"不相同"的答案是非常糟糕的。如果您能扩展"如何"它们是不同的,并且可能是一些用例,我会欢迎它。
是的,这些功能的作用是不同的。如官方文件所定义:
quot是整数除法,截断为零。
rem为整数余数,满足:
div是整数除法,被截断为负无穷大。
mod为整数模,满足:
1
| (x ` div` y )*y + (x ` mod` y ) == x |
当使用负数作为第二个参数且结果不是零时,您可以真正注意到差异:
1 2 3 4 5 6 7 8 9 10 11
| 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 |
nbsp;
- 你最后的四个例子可能不是你的意思,因为mod和rem比(-)的关联更强烈。我已经编辑了你的评论,因为我似乎不能在这个评论中放多行内容。
- @Erikhesslink:您在编辑时引入了一个错误。(-5) `mod` 3 == 1
- @承孙谢谢,我已经修好了。应该是审查后的生活。
实际上:
如果你知道两个操作数都是正的,你通常应该使用quot、rem或quotRem来提高效率。
如果你不知道两个操作数都是正的,你必须考虑一下你想要的结果是什么样子的。你可能不想要quotRem,但也可能不想要divMod。(x `div` y)*y + (x `mod` y) == x定律是一个很好的定律,但是向负无穷(knuth样式的除法)的四舍五入除法通常不如确保0 <= x `mod` y < y除法(欧几里得除法)有用且效率低。
如果您只想测试可分割性,那么应该始终使用rem。
本质上,x `mod` y == 0相当于x `rem` y == 0,但rem比mod快。