如何在OCaml中使用常规的模运算

时间:2019-01-21 15:46:20

标签: ocaml modulo

在OCaml中,-1 mod 3;;返回-1,但我希望结果是2。还有其他附加的模指令或类似的指令吗?

1 个答案:

答案 0 :(得分:5)

Ocaml遵循模的C定义:

  

当整数相除时,/运算符的结果是代数商,其中舍弃了任何小数部分。90)如果商a / b可表示,则表达式(a / b)* b + a%b等于

     

90)这通常称为“向零截断”。

这意味着它将给出-n + 1到n-1或0到n-1的余数。这是如何实现划分的不幸的副作用。对绝对值进行除法并最终纠正符号。

要获得正模,可以使用:

# let (mod) x y = ((x mod y) + y) mod y;;
val ( mod ) : int -> int -> int = <fun>
# -1 mod 3;;
- : int = 2
# 4 mod 3;;
- : int = 1

# let (mod) x y = let res = x mod y in if res < 0 then res + y else res;;
val ( mod ) : int -> int -> int = <fun>