OCaml中的模函数mod
返回的结果与python中的模运算符不同。
OCaml:
# -1 mod 4
- : int = -1
蟒:
>>> -1 % 4
3
为什么结果不同?
是否有任何标准模块函数在 OCaml 中按%
运行?
Python 在使用%
运算符方面略有不同,它实际上计算两个值的模,而其他编程语言使用相同的运算符计算余数。例如,在方案中,区别很明显:
(modulo -1 4) ; modulo
=> 3
(remainder -1 4) ; remainder
=> -1
在 Python 中:
-1 % 4 # modulo
=> 3
math.fmod(-1, 4) # remainder
=> -1
但在 OCaml 中,只有mod
(计算整数余数),根据下表和文档中所述:
-1 mod 4 (* remainder *)
=> -1
当然,你可以在remainder
方面实现自己的modulo
操作,像这样:
let modulo x y =
let result = x mod y in
if result >= 0 then result
else result + y
模的语义与整数除法的语义相关联(通常,如果Q
是整数除法的结果a / b
,而R
是a mod b
的结果,那么a = Q * b + R
必须始终为真),因此将整数除法的结果舍入为整数的不同方法会产生不同的模结果。
维基百科文章模运算有一个非常广泛的表格,关于不同语言如何处理模。有几种常见的方法:
-
在 C、Java、OCaml 和许多其他语言中,整数除法舍入为 0,这导致模的结果始终与除法具有相同的符号。在这种情况下,除数 (-1) 为负,因此模数也是负数 (-1)。
-
在 Python、Ruby 和许多其他语言中,整数除法总是向下舍入(朝向负无穷大),这导致模的结果始终与除数具有相同的符号。在这种情况下,除数 (4) 为正,因此模数也是正数 (3)。