Como você módulo ou restante em Erlang?

votos
39

Eu sou novo para Erlang. Como você faz modulo (obter o resto de uma divisão)? É% na maioria das linguagens C-like, mas que designa um comentário em Erlang.

Várias pessoas responderam com rem, que na maioria dos casos é bom. Mas estou revisitando este porque agora eu preciso usar números negativos e rem lhe dá o resto de uma divisão, o que não é o mesmo que modulo para números negativos.

Publicado 09/12/2008 em 16:52
fonte usuário
Em outras línguas...                            


8 respostas

votos
35

Em Erlang, 5 rem 3. dá 2, e 3. -5 rem dá -2. Se entendi sua pergunta, você iria querer -5 rem 3. para dar 1 vez, desde -5 = -2 * 3 + 1.

Será que isso fazer o que quiser?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
Respondeu 13/05/2009 em 16:30
fonte usuário

votos
26

O operador módulo é erlang rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Respondeu 09/12/2008 em 16:57
fonte usuário

votos
7

Eu usei o seguinte no elixir:

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

Por favor, não downvote isso porque é uma outra língua que não a pergunta. Nós todos vivemos o sonho, porque todos nós temos o feixe.

Respondeu 06/12/2016 em 22:31
fonte usuário

votos
3

De acordo com este post , é rem.

Respondeu 09/12/2008 em 16:56
fonte usuário

votos
2

O acima Y X + Y rem parece estar errado: ou (Y + X) rem Y ou Y + (X rem Y) produzir resultados incorrectos. Ex: seja Y = 3. Se X = -4, a primeira forma retorna -1, se X = -3 a segunda forma retorna 3, nenhum dos quais está no intervalo [0; 3 [.

Eu uso isso em vez disso:

% 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.
Respondeu 05/03/2010 em 12:40
fonte usuário

votos
1

A resposta aceita é errado.

remse comporta exatamente como o %operador C. moderna Ele usa divisão truncada.

A resposta aceita falhar por X <0 e Y <0. considere mod(-5,-3):

C:                     -5 % -3 == -2
rem:                 -5 rem -3 == -2
Y + X rem Y:    -3 + -5 rem -3 == -5 !! wrong !!

As implementações alternativas para o uso operador módulo pavimentado divisão e divisão euclidiana. Os resultados para estes são

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

assim

Y + X rem Y

não reproduzir qualquer operador módulo para X <0 e Y <0.

E remfunciona como esperado - ele está usando divisão truncada.

Respondeu 01/06/2015 em 16:58
fonte usuário

votos
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
Respondeu 20/05/2012 em 21:19
fonte usuário

votos
1

Erlang restante não trabalha com números negativos, então você tem que escrever sua própria função de parâmetros negativos.

Respondeu 13/05/2009 em 16:07
fonte usuário

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