python 中的模运算符相比, OCaml mod中的模函数返回结果不同。

OCaml:

# -1 mod 4
- : int = -1

Python:
>>> -1 % 4
3

为什么结果不同?

在OCaml中是否有任何可作为%运行的标准模块功能?

最佳答案

Python在%运算符的用法上略有不同,它实际上计算两个值的模,而其他编程语言使用相同的运算符计算余数。例如,Scheme中的区别很明显:

(modulo -1 4)    ; modulo
=> 3
(remainder -1 4) ; remainder
=> -1

在Python中:
-1 % 4           # modulo
=> 3
math.fmod(-1, 4) # remainder
=> -1

但是在OCaml中,根据此tabledocumentation中所述,只有mod(用于计算整数余数):
-1 mod 4 (* remainder *)
=> -1

当然,您可以按照modulo来实现自己的remainder操作,如下所示:
let modulo x y =
  let result = x mod y in
  if result >= 0 then result
  else result + y

10-07 15:33