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



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

OCaml:

# -1 mod 4
- : int = -1

蟒:

>>> -1 % 4
3

为什么结果不同?

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

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

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

在 Python 中:

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

但在 OCaml 中,只有mod(计算整数数),根据下表和文档中所述:

-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 / b,而Ra mod b的结果,那么a = Q * b + R必须始终为真),因此将整数除法的结果舍入为整数的不同方法会产生不同的模结果。

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

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

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

最新更新