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

时间:2017-10-15 18:42:31

标签: python operators ocaml modulo

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

OCaml的:

# -1 mod 4
- : int = -1

的Python:

>>> -1 % 4
3

为什么结果不同?。

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

2 个答案:

答案 0 :(得分:6)

Python在使用%运算符方面略有不同,它实际上计算了两个值的 modulo ,而其他编程语言计算余数与同一个运营商。例如,区别在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和{{3}中所述}:

-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

答案 1 :(得分:1)

模数的语义与整数除法的语义相关联(通常,如果Q是整数除法a / b的结果,Ra mod b的结果},然后a = Q * b + R必须始终为真),因此将整数除法的结果舍入为整数的不同方法将为模数产生不同的结果。

维基百科文章Modulo operation有一个非常广泛的表格,介绍了不同语言如何处理模数。有几种常见的方式:

  • 在C,Java,OCaml等许多语言中,整数除法向0舍入,这使得模数的结果总是与被除数具有相同的符号。在这种情况下,被除数(-1)是负数,因此模数也是负数(-1)。

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