Hab auch ein Problem mit dem Modulo von negativen Zahlen



  • Hallo,

    hab schon den Beitrag weiter unten gelesen, bin aber nicht so ganz daraus schlau geworden. Also zu meinen Problem. Ich schreib momentan nen binären Taschenrechner und der hat auch eine modulo funktion, welche für positive Zahlen auch die richtigen Ergebnisse liefert.

    Wenn ich aber z.B. -1011 mod 100 rechne kommt bei mir das B-Komplement von -3 raus. Hab mein Ergebnis mit dem vom Windows Taschenrechner verglichen und der liefert da eine 1 als Ergebnis.

    Meine Frage jetzt an euch ist es, ob ihr mir vielleicht nochmal genau erklären könnt wie ich modulo mit negative zahlen rechne. Müsste das erstmal verstehen damit ich das auch programmieren könnte. Achja die Formel aus den Beitrag weiter unten hab ich nich so ganz gerallt. Würd mich darüber freuen wenn einer die vielleicht nochmal bißchen genauer und mit einem anderen Beispiel erklären kann.

    Naja hoffe auf eure Hilfe


  • Mod

    Um bei deinem Beispiel mit mod 100 zu bleiben: Du musst die Zahl -1011 in die Form a + b*100 bringen. Wenn 0 <= a < 100, ist a das gewünschte Ergebnis der Modulooperation, der Rest der Division.

    Das Problem ist also das a mit der o.g. Randbedingung in folgender Gleichung zu bestimmen:
    1011=a+100b-1011 = a + 100b
    Wenn links etwas positives stehen würde, könnte man das Ergebnis schnell mit der üblichen modulo-Operation der CPU ausrechnen. Versuchen wir also, das Vorzeichen auf der linken Seite positiv zu bekommen:
    1011=a100b1011 = -a - 100b
    Die Zahl -a ist jetzt aber negativ, kann also nach Voraussetzung nicht das Ergebnis der Modulooperation sein. Also addiert man noch eine 100 auf das a:
    1011=100a100b100=(100a)100(b+1)1011 = 100 - a - 100b - 100 = (100 - a) - 100(b+1)
    (100 - a) ist also genau der Rest der Division 1011/100. Diesen Rest kannst du aber bereits problemlos bestimmen. Wenn du dann den Wert von (100-a) kennst, kennst du natürlich auch a, also das Ergebnis von -1011 mod 100.



  • such mal nach euklidischer algorithmus



  • Danke, ich denke dass ich es jetzt verstanden habe. Versuche das dann mal zu programmieren...

    MfG Cody20



  • Also ich habs doch noch nicht verstanden.
    Hab das Mal nach der Methode gemacht, aber da kommt bei mir irgendwie zwar für
    -1011 MOD 100 = 1 raus, was richtig ist.

    Aber wenn ich z.B. -101 MOD 11 rechne kommt auch 1 raus und nicht 10, was eigentlich richtig wäre.

    Hab versucht den rest mal mit dieser formel zu berechnen, dabei ist a= -101
    und b= 11.

    rest= b - ( a*(-1) MOD b )

    Hab mir diese Formel mal nach Christians Methode aufgebaut, denke aber das ich da was falsch gemacht habe, oder kann man diese Formel nicht verallgemeinern.

    Wäre sehr dankbar für euren Rat


  • Mod

    Cody20 schrieb:

    -1011 MOD 100 = 1 raus, was richtig ist.

    Sogar der Windows Taschenrechner sagt hier -11, das Ergebnis ist also (100-11) bzw. 89.

    Cody20 schrieb:

    Aber wenn ich z.B. -101 MOD 11 rechne kommt auch 1 raus und nicht 10, was eigentlich richtig wäre.

    Für -101 mod 11 erhältst du:
    101=a11b101 = - a - 11b
    101=(11a)11(b+1)101 = (11 - a) - 11(b + 1)
    (11-a) ist also das Ergebnis von 101 mod 11. 101 = 2 mod 11, also
    a=9a = 9.
    Also ist -101 = 9 mod 11.



  • ähm ich meinte -1011 MOD 100 im binären System, da kommt im win-tr dann 1 raus, wenn ich aber im win-tr im dezimal-modus -11 MOD 4 rechne kommt da -3 raus.

    Ich kann mir beim besten willen nicht erklären warum dass so ist. Das da was anderes rauskommt.

    Meine Formel die ich mir für meinen code su aufgstellt habe ist die falsch und kannst du mir vielleicht sagen warum bei obiger Rechnung im dezimalen system und
    im binären System trotz identischer Zahlen unterschiedliche Werte rauskommen?

    Das ist halt so mein Problem dass ich das nicht nachvollziehen kann...


  • Mod

    Cody20 schrieb:

    ähm ich meinte -1011 MOD 100 im binären System

    Wieso hast du das nicht gleich gesagt?

    Aber das Zahlensystem spielt ja eigentlich keine Rolle.

    Du hast vorhin geschrieben:

    Cody20 schrieb:

    Aber wenn ich z.B. -101 MOD 11 rechne kommt auch 1 raus und nicht 10, was eigentlich richtig wäre.

    Wieso wäre 10 deiner Meinung nach richtig?

    Du meinst also, dass -101 = 10 + a * 11 ist, für ganzzahliges a.
    10 - 10*11 ist -100, also noch zu groß. 10 - 11*11 ist aber -111, also schon zu klein. Also kann 10 nicht die Lösung sein.

    -101 ist 1 - 10*11, also ist -101 = 1 mod 11.



  • Naja also ich hab gedacht das es richtig wäre, weil dies beim win-tr im binären modus rauskommt.

    Also ich schenk eher dir mein Vertrauen als dem microSoft rechner, mich würd aber schon interessieren wie das ding darauf kommt.

    Die Rechnung die du erklärt hast, hab ich im weitesten verstanden, glaub ich.


  • Mod

    Cody20 schrieb:

    Naja also ich hab gedacht das es richtig wäre, weil dies beim win-tr im binären modus rauskommt.

    calc.exe rechnet im binären Modus mit negativen Zahlen nicht unbedingt so, wie es jeder erwarten würde; es speichert kein Vorzeichen, sondern rechnet mit dem 2er-Komplement.

    Mit dem 2er-Komplement funktioniert die Addition zwar ohne Änderungen, aber Modulo lässt sich nicht so einfach übernehmen. Um den wirklichen Rest der Division auszurechnen, muss man die Zahl als vorzeichenbehaftet betrachten und wie vorhin gepostet vorgehen.



  • Achso, naja also danke für deine Hilfe.
    Hab auf jeden Fall was dazu gelernt

    MfG Cody20


Anmelden zum Antworten