来自haskell报告:
如果y不为零,则quot,rem,div和mod类方法满足这些定律:
Run Code Online (Sandbox Code Playgroud)(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
Run Code Online (Sandbox Code Playgroud)
结果如何截断的区别在哪里?
Shr*_*saR 36
许多语言都有一个"mod"或"%"运算符,它在除法后给出余数,截断为0; 例如C,C++和Java,可能还有C#,会说:
(-11)/5 = -2
(-11)%5 = -1
5*((-11)/5) + (-11)%5 = 5*(-2) + (-1) = -11.
Run Code Online (Sandbox Code Playgroud)
Haskell的quot和rem旨在模仿这种行为.我可以想象在一些人为的情况下,可能需要与某些C程序的输出兼容.
Haskell的div和mod,随后Python的/和%,跟随数学家(至少数理论家)的约定,始终截断下来师(不计入0 -接近负无穷大),这样的形式始终是负数.因此在Python中,
(-11)/5 = -3
(-11)%5 = 4
5*((-11)/5) + (-11)%5 = 5*(-3) + 4 = -11.
Run Code Online (Sandbox Code Playgroud)
Haskell div并mod遵循这种行为.
luq*_*qui 25
这不完全是你问题的答案,但在x86上的GHC中,Int上的quotRem将编译为单个机器指令,而divMod则做了相当多的工作.因此,如果您处于速度关键部分并且只处理正数,那么可以使用quotRem.
一个简单的例子就是测试整数是偶数还是奇数.
let buggyOdd x = x `rem` 2 == 1
buggyOdd 1 // True
buggyOdd (-1) // False (wrong!)
let odd x = x `mod` 2 == 1
odd 1 // True
odd (-1) // True
Run Code Online (Sandbox Code Playgroud)
当然,请注意,您可以通过以这种方式定义odd来避免考虑这些问题:
let odd x = x `rem` 2 /= 0
odd 1 // True
odd (-1) // True
Run Code Online (Sandbox Code Playgroud)
一般来说,只要记住,因为y > 0,x mod y总是返回一些东西,>= 0同时x rem y返回0或与x相同的符号.
| 归档时间: |
|
| 查看次数: |
8254 次 |
| 最近记录: |