Как я могу использовать обычную операцию по модулю в OCaml - PullRequest
0 голосов
/ 21 января 2019

В OCaml -1 mod 3;; возвращает -1, но я бы ожидал 2 в результате. Есть ли другая дополнительная инструкция по модулю или аналогичная?

1 Ответ

0 голосов
/ 21 января 2019

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>
...