Haskell中`mod`和`rem`的区别

12 浏览
0 Comments

Haskell中`mod`和`rem`的区别

在Haskell中,modrem之间到底有什么区别呢?

两者似乎都会得出相同的结果。

*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

admin 更改状态以发布 2023年5月21日
0
0 Comments

是的,这些函数的行为不同。 如官方文档所定义:

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

 

0
0 Comments

在第二个参数为负数时,它们并不相同: \n

2 `mod` (-3)  ==  -1
2 `rem` (-3)  ==  2

0