首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell中`mod`和` in‘的区别

Haskell中`mod`和` in‘的区别
EN

Stack Overflow用户
提问于 2011-05-05 07:46:33
回答 5查看 103.8K关注 0票数 154

在Haskell中,modrem到底有什么不同?

两者似乎给出了相同的结果

代码语言:javascript
复制
*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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-05-05 07:54:21

当第二个参数为负时,它们是不同的:

代码语言:javascript
复制
2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2
票数 201
EN

Stack Overflow用户

发布于 2015-01-19 22:46:54

是的,这些函数的作用是不同的。如official documentation中所定义

quot是向零截断的整数除法

rem是整数余数,满足:

代码语言:javascript
复制
(x `quot` y)*y + (x `rem` y) == x

div是向负无穷大截断的整数除法

mod是整数模,满足:

代码语言:javascript
复制
(x `div` y)*y + (x `mod` y) == x

当您使用负数作为第二个参数并且结果不为零时,您可以真正注意到不同之处:

代码语言:javascript
复制
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
票数 78
EN

Stack Overflow用户

发布于 2015-01-19 23:14:28

实话实说:

如果您知道两个操作数都为正,则通常应使用quotremquotRem来提高效率。

如果你不知道两个操作数都是正的,你必须考虑你想要的结果是什么样子。您可能不想要quotRem,但也可能不想要divMod(x `div` y)*y + (x `mod` y) == x法则是一个非常好的法则,但是将除法舍入到负无穷大(Knuth风格除法)通常比确保0 <= x `mod` y < y (欧几里得除法)用处更小,效率也更低。

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5891140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档