`divmod()` und negative Zahlen
Verfasst: Mittwoch 2. März 2016, 16:26
Code: Alles auswählen
>>> divmod(-3, 2)
(-2, 1)
>>> divmod(3, 2)
(1, 1)
>>> divmod(-3, -2)
(1, -1)

Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Code: Alles auswählen
>>> divmod(-3, 2)
(-2, 1)
>>> divmod(3, 2)
(1, 1)
>>> divmod(-3, -2)
(1, -1)
Code: Alles auswählen
>>> -3 / 2
-2
Code: Alles auswählen
>>> -3 / -2
1
-3 : -2 = 1,5mutetella hat geschrieben:Weshalb ergibtaberCode: Alles auswählen
>>> -3 / 2 -2
Ich hätte auch im ersten Fall `-1` erwartet...Code: Alles auswählen
>>> -3 / -2 1
Da bringst du jetzt zwei Dinge durcheinander: Das Rundungsverhalten bei der ganzzahligen Division (die übrigens nicht nur von Python genutzt wird, sondern ein mathematisches Konzept ist) hat nichts mit dem Vorzeichen der Zahlen zu tun. Es wird wie gesagt immer bis zur nächsten ganzen Zahl abgerundet. Wenn das Ergebnis also -1,5 ist, dann ist die nächstniedrigere ganze Zahl (wegen *Ab*rundung) die -2.mutetella hat geschrieben:Python 2 rundet hier auf, obwohl es bei gleichen Vorzeichen abrundet. Unter Python 3 erhalte ich erwartungsgemäß ``-3 / 2 = -1.5``.
Code: Alles auswählen
printf("%d %d\n", (-3) / 2, (-3) % 2);
>>> -1 -1
Code: Alles auswählen
print divmod(-3,2)
>>> (-2, 1)
Was ganz schön verwirrend sein kann, wenn man Sachen in IPython testet und die sich dann anders verhalten (and man nicht weiß, dass sich Division/Modulo anders verhalten) ...Sirius3 hat geschrieben:Man muß halt, wie so oft, genau wissen, wie sich welche Programmiersprache verhält und ob dieses Verhalten im Sprachstandard definiert ist, weil man sich sonst nicht drauf verlassen kann.
Code: Alles auswählen
int py_div(int a, int b) {
return a < 0 ? (a - (b-1)) / b : a / b;
}
int py_mod(int a, int b) {
return cast(uint)a % b;
}
Das war mir neu. Ich dachte, das Vorgehen sei bei den meisten Sprachen gleich. Ich hatte es allerdings nicht überprüft.Sirius3 hat geschrieben:@snafu: wie der von BlackJack verlinkte Artikel schön beschreibt, gibt es eben verschiedene Arten, wie man eine Ganzzahldivision mathematisch definiert. Hier haben Fortran, C, Java und x86-Prozessoren einen anderen Weg eingeschlagen als z.B. Python