OCaml mod函数返回的结果与%

2024-05-29 07:38:35 发布

您现在位置:Python中文网/ 问答频道 /正文

OCamlmod中的模函数返回结果与python中的模运算符不同。

OCaml:

# -1 mod 4
- : int = -1

Python:

>>> -1 % 4
3

为什么结果不同?。

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


Tags: 模块函数mod标准运算符intocamlocamlmod
2条回答

模的语义与整数除法的语义相联系(一般来说,如果Q是整数除法的结果a / b,而Ra mod b的结果,那么a = Q * b + R必须始终为真),因此,不同的整数除法结果舍入为整数的方法将为模产生不同的结果。

维基百科的文章Modulo operation有一个关于不同语言如何处理模的非常广泛的表。有几种常见的方法:

  • 在C、Java、OCaml等语言中,整数除法向0舍入,这导致模的结果始终与被除数具有相同的符号。在这种情况下,红利(-1)是负的,所以模也是负的(-1)。

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

Python在使用%运算符方面有点不同,它真正计算两个值的,而其他编程语言使用相同的运算符计算余数。例如,方案中的区别很明显:

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

在Python中:

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

但在OCaml中,只有mod(它计算整数余数),根据这个table,如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

相关问题 更多 >

    热门问题