Как вы делаете modulo или остаток в Erlang?
Я новичок в Erlang. Как вы делаете modulo (получите остаток от деления)? Это% в большинстве C-подобных языков, но это обозначает комментарий в Erlang.
Несколько человек ответили бременем, что в большинстве случаев прекрасно. Но я пересматриваю это, потому что теперь мне нужно использовать отрицательные числа, а rem дает вам остальную часть деления, которая не совпадает с модулем для отрицательных чисел.
Ответы
Ответ 1
В Erlang 5 rem 3.
дает 2
, а -5 rem 3.
дает -2
. Если я понимаю ваш вопрос, вы бы хотели, чтобы -5 rem 3.
вместо 1 давал 1, поскольку -5 = -2 * 3 + 1.
Делает ли это то, что вы хотите?
mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
Ответ 2
Оператор modulo erlang rem
Eshell V5.6.4 (abort with ^G)
1> 97 rem 10.
7
Ответ 3
Я использовал в эликсире следующее:
defp mod(x,y) when x > 0, do: rem(x, y);
defp mod(x,y) when x < 0, do: rem(x, y) + y;
defp mod(0,_y), do: 0
Пожалуйста, не уменьшайте это, потому что это другой язык, чем вопрос. Мы все живем мечтой, потому что у всех нас есть луч.
Ответ 4
Согласно этот пост в блоге, он rem
.
Ответ 5
Вышеуказанное Y + X rem Y кажется неправильным: либо (Y + X) rem Y, либо Y + (X rem Y) дают неверные результаты. Пример: пусть Y = 3. Если X = -4, первая форма возвращает -1, если X = -3, вторая форма возвращает 3, ни одна из которых не находится в [0; 3 [.
Я использую это вместо:
% Returns the positive remainder of the division of X by Y, in [0;Y[.
% In Erlang, -5 rem 3 is -2, whereas this function will return 1,
% since -5 =-2 * 3 + 1.
modulo(X,Y) when X > 0 ->
X rem Y;
modulo(X,Y) when X < 0 ->
K = (-X div Y)+1,
PositiveX = X + K*Y,
PositiveX rem Y;
modulo(0,_Y) ->
0.
Ответ 6
Остаток Erlang не работает с отрицательными числами, поэтому вам нужно написать свою собственную функцию для отрицательных параметров.
Ответ 7
mod(A, B) when A > 0 -> A rem B;
mod(A, B) when A < 0 -> mod(A+B, B);
mod(0, _) -> 0.
% console:
3> my:mod(-13, 5).
2
Ответ 8
Принятый ответ неверен.
rem
ведет себя точно так же, как оператор %
в современном C. Он использует усеченное деление.
Принимаемый ответ терпит неудачу для X < 0 и Y < 0. Рассмотрим mod(-5,-3)
:
C: -5 % -3 == -2
rem: -5 rem -3 == -2
Y + X rem Y: -3 + -5 rem -3 == -5 !! wrong !!
Альтернативные реализации для оператора modulo используют разделение полов и евклидово разделение. Результаты для них
flooring division: -5 mod -3 == -2
euclidean division: -5 mod -3 == 1
Итак,
Y + X rem Y
не воспроизводит какой-либо модульный оператор для X < 0 и Y < 0.
И rem
работает как ожидалось - он использует усеченное деление.