Mache ich den Modul falsch? Da in Java -13 % 64
sollte bewerten , -13
aber ich erhalte 51
.
java
math
modulo
negative-number
Jakir00
quelle
quelle
%
ist ein Restoperator.Antworten:
Beide Definitionen des Moduls negativer Zahlen werden verwendet - einige Sprachen verwenden eine Definition und andere die andere.
Wenn Sie eine negative Zahl für negative Eingänge erhalten möchten, können Sie Folgendes verwenden:
Ebenso, wenn Sie eine Sprache verwenden, die bei einer negativen Eingabe eine negative Zahl zurückgibt, und Sie eine positive bevorzugen würden:
quelle
x % y
A) gegeben ist,x
ist der Rest negativ, dh negativx % y == -(-x % y)
. B) das Zeichen vony
hat keine Wirkung, dhx % y == x % -y
Da "mathematisch" beide richtig sind:
Eine der Optionen musste von Java-Sprachentwicklern ausgewählt werden und sie wählten:
Sagt es in Java-Spezifikationen:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
quelle
-13 % 64 = 51
als ich erwartet hatte-13
?".int result = (-5) % 3;
gibt -2.int result = (-3) % 5;
gibt -3. Gibt im Allgemeinenint result = (-a) % b;
die richtige Antwort, wenn | -a | > b. Um das richtige Ergebnis zu erhalten, wenn | -a | <b wir sollten den Divisor einwickeln.int result = ((-a) % b) + b;
für negative a oderint result = (((-a) % b) + b) % b;
für positive oder negative aSind Sie sicher, dass Sie in Java arbeiten? Weil Java wie erwartet -13% 64 = -13 ergibt. Das Zeichen der Dividende!
quelle
Ihr Ergebnis ist für Java falsch. Bitte geben Sie einen Kontext an, wie Sie dazu gekommen sind (Ihr Programm, Ihre Implementierung und Ihre Java-Version).
Von dem Java-Sprachspezifikation
Da / gegen Null gerundet ist (was zu Null führt), sollte das Ergebnis von% in diesem Fall negativ sein.
quelle
int result = (-5) % 3;
gibt -2int result = (-3) % 5;
gibt -3 Gibt im Allgemeinenint result = (-a) % b;
die richtige Antwort, wenn | -a | > b Um das richtige Ergebnis zu erhalten, wenn | -a | <b wir sollten den Divisor einwickeln.int result = ((-a) % b) + b;
für negativ a oderint result = (((-a) % b) + b) % b;
für positiv oder negativ a.(-3) % 5
das richtige Ergebnis gemäß der Definition-3
, und eine korrekte Implementierung von Java sollte dieses Ergebnis erzeugen.(-3)%5
tatsächlich-3
, und wenn wir den positiven Rest wollen, sollten wir 5 hinzufügen, und dann wird das Ergebnis sein2
Sie können verwenden
quelle
((x % k) + k) % k
. (Obwohl Ihre wahrscheinlich besser lesbar ist.)[0, sign(divisor) * divisor)
statt liegt[0, sign(dividend) * divisor)
.Ihre Antwort ist in Wikipedia: Modulo-Betrieb
Es heißt, dass in Java das Vorzeichen für die Modulo-Operation das gleiche ist wie das der Dividende. und da wir über den Rest der Divisionsoperation sprechen, ist es in Ordnung, dass sie in Ihrem Fall -13 zurückgibt, da -13/64 = 0. -13-0 = -13.
EDIT: Sorry, habe deine Frage falsch verstanden ... Du hast recht, Java sollte -13 geben. Können Sie mehr umgebenden Code bereitstellen?
quelle
Die Modulo-Arithmetik mit negativen Operanden wird vom Sprachdesigner definiert, der sie möglicherweise der Sprachimplementierung überlässt und die Definition möglicherweise auf die CPU-Architektur verschiebt.
Ich konnte keine Java-Sprachdefinition finden.Dank Ishtar sagt die Java-Sprachspezifikation für den Restoperator% , dass das Vorzeichen des Ergebnisses mit dem Vorzeichen des Zählers übereinstimmt.
quelle
Um dies zu überwinden, können Sie
64
den negativen Wert addieren (oder was auch immer Ihre Modulbasis ist), bis er positiv istDas Ergebnis liegt weiterhin in derselben Äquivalenzklasse.
quelle
x = x + m = x - m
im Modulm
.also
-13 = -13 + 64
im Modul64
und-13 = 51
im Modul64
.Nehmen wir an
Z = X * d + r
, wenn wir0 < r < X
dann in Division den Rest nennen. gibt den Rest von zurück .Z/X
r
Z % X
Z/X
quelle
Die Mod-Funktion ist definiert als der Betrag, um den eine Zahl das größte ganzzahlige Vielfache des Divisors überschreitet, das nicht größer als diese Zahl ist. Also in deinem Fall von
Das größte ganzzahlige Vielfache von 64, das -13 nicht überschreitet, ist -64. Wenn Sie nun -13 von -64 subtrahieren, entspricht dies 51
-13 - (-64) = -13 + 64 = 51
quelle
In meiner Version von Java JDK 1.8.0_05 -13% 64 = -13
Sie könnten versuchen, -13- (int (-13/64)), mit anderen Worten, eine Division in eine ganze Zahl umzuwandeln, um den Bruchteil zu entfernen, und dann vom Zähler zu subtrahieren. Also sollte Zähler- (int (Zähler / Nenner)) das Richtige geben Rest & Zeichen
quelle
In Java erhalten Sie die neuesten Versionen
-13%64 = -13
. Die Antwort hat immer ein Zählerzeichen.quelle
Gemäß Abschnitt 15.17.3 des JLS "erzeugt die Restoperation für Operanden, die nach der binären numerischen Heraufstufung ganze Zahlen sind, einen Ergebniswert, so dass (a / b) * b + (a% b) gleich a ist. Diese Identität gilt gerade in dem speziellen Fall, dass die Dividende die negative ganze Zahl von größtmöglicher Größe für ihren Typ ist und der Divisor -1 ist (der Rest ist 0). "
Hoffentlich hilft das.
quelle
Ich glaube nicht, dass Java in diesem Fall 51 zurückgibt. Ich verwende Java 8 auf einem Mac und bekomme:
Programm:
quelle