OCaml mod 函数 returns 与 % 相比结果不同

OCaml mod function returns different result compared with %

OCaml mod return 中的模函数与 python[ 中的模运算符相比结果不同=30=].

OCaml:

# -1 mod 4
- : int = -1

Python:

>>> -1 % 4
3

为什么结果不同?

在 OCaml 中是否有作为 % 运行的任何标准模块函数?

Python 与 % 运算符的用法有点不同,它真正计算两个值的 ,而其他编程语言计算remainder 使用相同的运算符。比如Scheme中区分的很清楚:

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

在Python中:

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

但在 OCaml 中,只有 mod(计算整数 余数),根据此 table and as stated in the documentation:

-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 / bR是[=的结果13=],则 a = Q * b + R 必须始终为真),因此将整数除法结果四舍五入为整数的不同方法将产生不同的模数结果。

维基百科文章 Modulo operation 对不同语言如何处理模有非常广泛的 table。常用的有几种方式:

  • 在 C、Java、OCaml 和许多其他语言中,整数除法向 0 舍入,这导致模的结果始终与被除数具有相同的符号。在这种情况下,被除数 (-1) 为负,因此模数也为负 (-1)。

  • 在 Python、Ruby 和许多其他语言中,整数除法总是向下舍入(朝向负无穷大),这导致模的结果总是具有与除数符号相同。在这种情况下,除数 (4) 为正,因此模数也为正 (3).