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

Lav*_*air 1 ocaml modulo

在OCaml -1 mod 3;;返回,-1但我希望2结果.是否有其他额外的模数指令或类似的?

Gos*_*low 5

Ocaml遵循模数的C定义:

当整数被划分时,/运算符的结果是代数商,丢弃任何小数部分.90)如果商a/b是可表示的,则表达式(a/b)*b + a%b应等于a.

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
Run Code Online (Sandbox Code Playgroud)

要么

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