Wie ist mod für n < 0 definiert?
-
OK, alles klar.
Danke.
Edit:
Wobei wenn nur (n-x) === -x | (mod n) gelten muss,
dann könnten die ganzen Rechner ja auch.....7, 3, -1,-5, -9,.......
ausgeben.
Naja, wenn man weiß was kommt kann man drauf reagieren, ich seh das jetzt nicht so eng.
-
der standard garantiert, dass
( a / b ) * b + a % b == afür alle b != 0
er garantiert nicht, dass die division für negative a/b in richtung 0 rundet. das ist aber bei praktisch allen implementationen der fall und führt automatisch dazu, dass a%b negativ oder 0 ist, wenn a und b verschiedene vorzeichen haben.
-
Der Modulo Operator in C++ und Java arbeitet falsch im mathematischen Sinn
#include <iostream> using namespace std; // Mathematisch korrekte Modulooperation int mod(int a, int b) { return(b + (a%b)) % b; } int main() { cout<<mod(-14, 3)<<endl; // Gibt 1 aus }
mehr dazu findet man unter Zahlentheorie -> Teilen mit Rest
einfach mit Google nach Forster und Zahlentheorie suchen - der Herr Forster hat momentan ein Skript zur Vorlesung Zahlentheorie online - im 2ten Kapitel wird teilen mit Rest behandelt
-
Vertexwahn schrieb:
Der Modulo Operator in C++ und Java arbeitet falsch im mathematischen Sinn
falsch.
-
> falsch
reste sind immer positiv im mathematischen Sinn - ich verweise hier auf die Bücher von Forster + Hartmann - Mathematik für Informatiker
warum falsch?
Welche Quellen hast du den?
-
Vertexwahn hat recht! Und weil es so schön ist:
Bsp.:
-7 mod 5 = 3 (mathematisch) ->richtig
-7 mod 5 = -2 (V$ 6.0) ->falsch
-
Vertexwahn schrieb:
reste sind immer positiv im mathematischen Sinn
nicht-negativ *duck*
-
jedeer kann und darf sich mod definieren, wie er mag. es gibt keine "mathematische" definition. "die mathematik" ist kein großes grünes monster, das uns irgendetwas vorschreibt.
willste ne vorschrift, dann such in den DIN-normen, wie mod definiert ist. dort schaut man ja auch nac, wenn man wissen will, ob 0 eine natürliche zahl ist. nicht in der mathematik, dort steht es nämlich nicht (bzw dort stehen klar und deutlich beide sich widersprechende definitionen). und jetzt hört mit dem albernen "mathematisch korrekt" auf.
-
Beim Hashing ist es vorteilhaft, wenn man nur positive Reste hat - ein negativer Indexwert in einem Array kann böse Folgen haben
ok: dann definiert sich halt jeder seine Modulooperation so wie er will -
a mod b ist immer 1in der Mathematik (und wir sind jetzt im Mathematik Forum) ist es halt mal so das die modulo Operation so festgelegt wird wie beschrieben - zeig mir ein Skript, Buch wo es anders gemacht wird
BTW: @Volkard: Danke für deinen C++ Kurs! Hat mir sehr geholfen!
-
In einigen Sprachen (z.b. Ada und Common Lisp) gibt es einen mod-Operator und einen rem-Operator. Ersterer arbeitet "mathematisch korrekt", wenn man das denn so nennen will, also so dass a mod b = c bedeutet, a in der c-ten Restklasse (modulo b) liegt, d.h. c liegt in [0, b-1] für positive b, unabhängig vom Vorzeichen von a. Für negative b ist c dann entsprechend negativ.
Beim rem-Operator ("remainder" = Rest) hat das Ergebnis das Vorzeichen von a. In C++ ist es unspezifiziert, welche Bedeutung % hat.