与%相比,OCaml mod函数返回不同的结果

yto*_*obi 5 python ocaml operators modulo

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

OCaml的:

# -1 mod 4
- : int = -1
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

>>> -1 % 4
3
Run Code Online (Sandbox Code Playgroud)

为什么结果不同?

是否有任何标准模块功能,如%OCaml中那样运行?

Ósc*_*pez 6

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

(modulo -1 4)    ; modulo
=> 3
(remainder -1 4) ; remainder
=> -1
Run Code Online (Sandbox Code Playgroud)

在Python中:

-1 % 4           # modulo
=> 3
math.fmod(-1, 4) # remainder
=> -1
Run Code Online (Sandbox Code Playgroud)

但OCaml中,有只mod(其中计算整数余数),根据该和邮件中注明文档:

-1 mod 4 (* remainder *)
=> -1
Run Code Online (Sandbox Code Playgroud)

当然,您可以按照以下方式实现自己的modulo操作remainder:

let modulo x y =
  let result = x mod y in
  if result >= 0 then result
  else result + y
Run Code Online (Sandbox Code Playgroud)