Как вы по модулю или остаток в Erlang?

голоса
39

Я новенькая Erlang. Как вы это делаете по модулю (получить остаток от деления)? Это% в большинстве C-подобных языках, но это обозначает комментарий в Erlang.

ответили несколько человек с бэр, что в большинстве случаев это хорошо. Но я пересматриваю это, потому что теперь мне нужно использовать отрицательные числа и рем дает остаток от деления, который не является таким же, как по модулю для отрицательных чисел.

Задан 09/12/2008 в 16:52
источник пользователем
На других языках...                            


8 ответов

голоса
35

В Эрланге, 5 бэр 3. дают 2 и 3. -5 бэр дает -2. Если я правильно понял ваш вопрос, вы хотите -5 бэр 3. дать 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.
Ответил 13/05/2009 в 16:30
источник пользователем

голоса
26

Оператор Эрланга по модулю является rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Ответил 09/12/2008 в 16:57
источник пользователем

голоса
7

Я использовал следующий в эликсире:

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

Пожалуйста, не downvote это, потому что это другой язык, чем вопрос. Мы все живем в сон, потому что мы все имеем луч.

Ответил 06/12/2016 в 22:31
источник пользователем

голоса
3

Согласно этому сообщению в блоге , это rem.

Ответил 09/12/2008 в 16:56
источник пользователем

голоса
2

Выше Y + X, Y бэр кажется неверным: либо (Y + X), бэр Y или Y + (Х бэр Y), дают неправильные результаты. Пример: Пусть Y = 3. Если X = -4, первая форма возвращает -1, если Х = -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.
Ответил 05/03/2010 в 12:40
источник пользователем

голоса
1

Принятый ответ неверен.

remведет себя так же , как %оператор в современном С. использует укороченное деление.

Принятый ответ не выполняется для 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 !!

Альтернативные реализации для использования оператора по модулю сражены деление и евклидово деления. Результаты тех

flooring division:   -5 mod -3 == -2
euclidean division:  -5 mod -3 == 1

Так

Y + X rem Y

не воспроизводит любой оператор по модулю для X <0 и Y <0.

И remработает , как ожидалось - он использует укороченное деление.

Ответил 01/06/2015 в 16:58
источник пользователем

голоса
1
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
Ответил 20/05/2012 в 21:19
источник пользователем

голоса
1

Erlang остальное не работает с отрицательными числами, так что вы должны написать свою собственную функцию для отрицательных параметров.

Ответил 13/05/2009 в 16:07
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more