Guter Tag Modulo oder Rest in Erlang?

stimmen
39

Ich bin ganz neu in Erlang. Wie geht es Ihnen Modulo (den Rest einer Division bekommen)? Es ist% in den meist C-ähnlichen Sprachen, aber das bezeichnet einen Kommentar in Erlang.

Mehrere Personen mit rem beantwortet, die in den meisten Fällen ist in Ordnung. Aber ich bin erneuten Besuch dieses jetzt, weil ich negative Zahlen verwenden müssen und rem gibt Ihnen den Rest einer Division, die für negative Zahlen nicht das gleiche wie Modulo ist.

Veröffentlicht am 09/12/2008 um 16:52
quelle vom benutzer
In anderen Sprachen...                            


8 antworten

stimmen
35

In Erlang, 5 rem 3. gibt 2 und -5 rem 3. gibt -2. Wenn ich Ihre Frage verstehen, würden Sie wollen, -5 rem 3. 1 anstatt zu geben, da -5 = -2 * 3 + 1.

Ist dies tun, was Sie wollen?

mod(X,Y) when X > 0 -> X rem Y;
mod(X,Y) when X < 0 -> Y + X rem Y;
mod(0,Y) -> 0.
Beantwortet am 13/05/2009 um 16:30
quelle vom benutzer

stimmen
26

Der erlang Modulo-Operator ist rem

Eshell V5.6.4  (abort with ^G)
1> 97 rem 10.
7
Beantwortet am 09/12/2008 um 16:57
quelle vom benutzer

stimmen
7

Ich habe folgend in Elixier:

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

Bitte verwenden Sie diese nicht downvote, weil sie eine andere Sprache als die Frage ist. Wir alle leben den Traum, weil wir alle den Strahl haben.

Beantwortet am 06/12/2016 um 22:31
quelle vom benutzer

stimmen
3

Nach dieser Blog - Post , es ist rem.

Beantwortet am 09/12/2008 um 16:56
quelle vom benutzer

stimmen
2

Das obige Y + X Y rem scheint falsch zu sein: entweder (Y + X) rem Y oder Y + (X rem Y) falsche Ergebnisse liefern. Ex: sei Y = 3. Wenn X = -4, gibt die erste Form 1, wenn X = -3 die zweite Form 3 zurückkehrt, von denen keine in [0, 3 [.

Ich benutze diese statt:

% 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.
Beantwortet am 05/03/2010 um 12:40
quelle vom benutzer

stimmen
1

Die akzeptierte Antwort ist falsch.

remverhält sich genau wie der %Bediener in der modernen C. abgeschnittene Division verwendet.

Die akzeptierte Antwort nicht für X <0 und Y <0. betrachten wir mod(-5,-3):

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

Die alternativen Implementierungen für die Modulo-Operator Verwendung platt Division und Division mit Rest. Die Ergebnisse sind für diejenigen,

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

Damit

Y + X rem Y

keinen Modulo-Operator für X reproduzieren <0 und Y <0.

Und remwie erwartet funktioniert - es wird mit abgeschnittener Division.

Beantwortet am 01/06/2015 um 16:58
quelle vom benutzer

stimmen
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
Beantwortet am 20/05/2012 um 21:19
quelle vom benutzer

stimmen
1

Erlang Rest funktioniert nicht mit negativen Zahlen, so müssen Sie Ihre eigene Funktion für negative Parameter schreiben.

Beantwortet am 13/05/2009 um 16:07
quelle vom benutzer

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