PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Modulo-Operation unter Java


Gast
2004-01-29, 17:09:57
Moin,

was macht Java, wenn ich auf eine negative Zahl eine Modulo Operation (mittel %) anwende? Also z.b. -5 % n
Wird dann solange n addiert, bis die Zahl positiv ist?

Aqualon
2004-01-29, 18:04:49
-x%n hat in Java immer ein negatives Ergebnis (unabhängig ob n positiv oder negativ ist).

Berechnet wird es genauso wie der positive Modulo, nur dass das Ergebnis eben negativ ist.

Bsp: -5%2 = -5%-2 = -(5%2) = -(5%-2) = -1

Du addierst also bei negativem x den Betrag von n so lange zu x hinzu, bis der Betrag des Rests kleiner als n ist. Bei positivem x verläuft es analog, nur dass der Betrag von n eben abgezogen wird.

Aqua

Gast
2004-01-29, 18:18:02
Mist, das macht die Sache ungemein schwieriger! (BTW: Ist das überhaupt mathematisch korrekt?)

Aqualon
2004-01-29, 18:27:59
Original geschrieben von Gast
Mist, das macht die Sache ungemein schwieriger! (BTW: Ist das überhaupt mathematisch korrekt?)
Der Windows Taschenrechner macht es genauso. Eine genaue mathematische Definition von Modulo kenn ich leider auch nicht.

Aqua

HellHorse
2004-01-29, 18:53:21
Ja es ist mathematisch korrekt.
Zur Erinnerung: in Z/nZ ist die Restklasse von k das gleiche wie die Restklasse k + n * x (x e N).
Beispiel:
In Z/5Z ist -2 und 3 das Gleiche.
Trotzdem wäre es schöner, wenn man als Resultat nur Zahlen von 0 bist n-1 erhalten würde.

Gast
2004-01-29, 18:56:37
Original geschrieben von HellHorse
Ja es ist mathematisch korrekt.
Zur Erinnerung: in Z/nZ ist die Restklasse von k das gleiche wie die Restklasse k * n * x (x e N).
Beispiel:
In Z/5Z ist -2 und 3 das Gleiche.
Trotzdem wäre es schöner, wenn man als Resultat nur Zahlen von 0 bist n-1 erhalten würde.
yup, das macht das Arbeiten in einem Array ungemein einfacher! ;) Naja, ich hab das Problem gelöst, jetzt hab ich anstelle von nur 2 großen Schleifen, noch ein paar kleiner, in denen ich die Sonderfälle behandle!
Danke an alle!

zeckensack
2004-01-29, 23:09:29
Original geschrieben von Gast
Mist, das macht die Sache ungemein schwieriger!Kannst du nicht vor dem Modulo den Betrag bilden ?(
abs(x) oder so?

edit:
Öhm, vergiss was ich geschrieben habe ...

Die wahren Helden arbeiten mit Zweierpotenzen und bitweisem AND in C++ :D
class
IntRingBuffer
{
public:
IntRingBuffer(uint size_log2)
{
data=(int*)malloc((1<<size_log2)*sizeof(int));
address_mask=(1<<size_log2)-1;
}
~IntRingBuffer(uint size_log2)
{
free(data);
}

int get(int index)
{
return(data[index&address_mask]);
}
private:
int* data;
uint address_mask;
};
:naughty:

El Fantastico
2004-01-30, 19:13:40
Dazu ist noch anzumerken, dass der eigentlich nicht modulo-Operator sondern remainder-Operator heisst (funkt. z.B. auch mit floats)

http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#24956