Fiesek Geschrieben 21. Oktober 2002 Teilen Geschrieben 21. Oktober 2002 Grüß Euch! Welches Ergebnis liefert eigentlich eine Rechenmaschine bei sagen wir mal folgendem Code: int a,b,c,d; a=3; b=2; c=1; d=a-b+c; printf("d = %d",d); Ich hab es einfach mal im C-Code hingeschrieben, es ist aber auch formatierbar für andere Sprachen oder sehen wir es einfach als Pseudocode, aber interessanter ist das Ergebnis und vieleicht eine Begründung dafür. Bei uns ist eine heiße Diskussion entbrannt welches Ergebnis richtig ist und welches nicht oder vieleicht gibt es auch mehrere mögliche Lösungen. Danke für jedes sachdienliche Posting! GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Crush Geschrieben 21. Oktober 2002 Teilen Geschrieben 21. Oktober 2002 Ich rate einfach mal: 3-2+1 sollte also theoretisch 2 ergeben. Laß ich den Code laufen ... ist d=2 und die Ausgabe ist auch 2! Was sollte da falsch oder anders sein? Das einzigste was sein könnte ist, daß ein Compiler die Operatoren in undefinierter Reihenfolge übersetzt (was auch tatsächlich in C & C++ Sache des Compilerbauers ist), sich allerdings in diesem Fall nicht sonderlich auswirken sollte. Mich würden mal Eure davon abweichenden Diskussionsvorschläge interessieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
kingofbrain Geschrieben 22. Oktober 2002 Teilen Geschrieben 22. Oktober 2002 Morgen!! Nachdem meiner Meinung nach der '=' - Operator als letztes ausgewertet wird (festlegung) und die anderen beiden Berechnungen vertauschbar sind (das Fremdwort habe ich am Tag meiner Abifeier vergessen), sollte das Ergebnis eindeutig sein: 2 Es könnte sein, dass durch eine Rundung bei Fliesskommatypen etwas anderes rauskommt, aber bei Ganzzahlwerten müsste es eindeutig sein. Der Compiler dürfte keine Rolle spielen. Jedoch lasse ich mich gerne eines besseren belehren. k.o.b Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jusky Geschrieben 22. Oktober 2002 Teilen Geschrieben 22. Oktober 2002 Ich würde auch sagen, dass 2 rauskommt. Iss ja nix eingeklammert bzw. keine "Punktrechnung" vorhanden, die man beachten müsste... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 22. Oktober 2002 Teilen Geschrieben 22. Oktober 2002 Ich kann mir nicht vorstellen, dass es Programmiersprachen gibt, die in ihrer Spezifikation etwas so wichtiges wie die Auswertungsreihenfolge einer Verkettung von Operatoren mit gleicher Priorität nicht behandeln. Wenn ich mich richtig erinnere, ist es zumindest bei C++ so, dass festgelegt ist, dass zweiseitige Operatoren (mit Ausnahme der Zuweisungen) linksbindend sind, also: a = b = c entspricht a = (b = c) und a + b + c entspricht (a + + c Das ist IMHO die Lösung, die der Intuition des Lesers am nächsten kommt. Ich glaube nicht, dass irgendeine Sprache das anders löst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 22. Oktober 2002 Teilen Geschrieben 22. Oktober 2002 Tja - wie das nun richtig ausgewertet wird weiß ich auch nicht, aber viele Compiler machen es, so glaube ich, von links nach rechts! Also: d = (a-+c Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 22. Oktober 2002 Autor Teilen Geschrieben 22. Oktober 2002 Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation. Kein Witz, ich mein es Ernst mit UPN. Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0. Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden? Nach UPN sieht die Aufgabe so aus: d=a-(b+c); Das Ergebnis wäre dann Null. Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat. Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik. GREETZ ******** * Fiesek * ******** Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Original geschrieben von kingofbrain Das wäre aber ein grober Missgriff gegen die grundlegenden Regeln der Mathematik, in der gilt, dass ich Strichrechnungen untereinander austauschen kann (Fachwort hab ich immer noch vergessen). Das ist so nicht ganz richtig. Die Addition ist zwar assoziativ und kommutativ, die Subtraktion aber nicht. In der Mathematik werden solche Ausdrücke einfach von links nach rechts abgearbeitet, daher nehme ich an, dass das bei allen Programmiersprachen genauso ist. @Fiesek: Plus vor Minus? :eek: Für welche Programmiersprache soll denn diese Tabelle gewesen sein? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by kingofbrain Morgen!! Nachdem meiner Meinung nach der '=' - Operator als letztes ausgewertet wird (festlegung) und die anderen beiden Berechnungen vertauschbar sind (das Fremdwort habe ich am Tag meiner Abifeier vergessen), sollte das Ergebnis eindeutig sein: 2 Es könnte sein, dass durch eine Rundung bei Fliesskommatypen etwas anderes rauskommt, aber bei Ganzzahlwerten müsste es eindeutig sein. Der Compiler dürfte keine Rolle spielen. Jedoch lasse ich mich gerne eines besseren belehren. k.o.b Ist das Fremdwort das du meinst "kommutativ" ? Das gilt ja auch bei der Multiplikation. Ich weiss allerdings momentan nicht was das Geheimnis von d = a-b +c ist. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Fiesek Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation. Kein Witz, ich mein es Ernst mit UPN. Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0. Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden? Nach UPN sieht die Aufgabe so aus: d=a-(b+c); Das Ergebnis wäre dann Null. Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat. Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik. GREETZ ******** * Fiesek * ******** Ich weiss zwar nicht auf welche Sprache sich dein Unterricht bezogen hat aber UPN bedeutet das man erst die Opranden und dann den Operator eingibt. Damit kann man dann schön stack-basierte Operationen ausführen. Beispiel: b c + -> Ergebnis kommt dann auch auf den Stack a - -> ist dann das Ergebnis und kommt auch auf den Stack Und das ist auch keine UPN was du da geschrieben hast sondern ganz normale (unpolnische Notation). Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Fiesek Nun gut, mir ist da aber die UPN untergekommen, UPN = umgekehrte polnische Notation. Kein Witz, ich mein es Ernst mit UPN. Ich hätte gehofft, dass mir hier jemand nochmal ganz genau erklären kann, wie die Maschinen eigentlich rechnen und warum nun wirklich d=2 ist und nicht 0. Wir hatten im Unterricht eine Operatoren-Prioritäten-Tabelle, in der eindeutig stand, dass in dem Fall + eine höhere Priorität hat als -, komischerweise rechnet mein PC in C++, C, Java und Java-Script anders oder hab ich da was missverstanden? Nach UPN sieht die Aufgabe so aus: d=a-(b+c); Das Ergebnis wäre dann Null. Die Klammern würden vom PC automatisch gesetzt, weil ja + eine höhere Priorität hat. Allerdings ist diese Tabelle aus einem Buch, welches Anfang der 80er verfasst wurde, vieleicht gabs eine Änderung in der Informatik. GREETZ ******** * Fiesek * ******** Ich würde dir empfehlen einfach mal zurück in die 7 Klasse Hauptschule oder so oder lernt man das heute dort nicht mehr: a-b+c <> a - ( b +c ) wenn man die Klammer auflöst dann kommt für a - ( b+c) nämlich a - b - c heraus was dann 0 ergibt wenn man für a = 3 , b =2 und c =1 annimmt da: 0 = 3 -2 -1 <> 3-2+1 oder 3 - ( 2+1) = 0 Die Klammer ändert die Reihenfolge der Abarbeitung, das ist Mathematik aus der 7. Klasse. Das kann ja nicht wahr sein. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Hallo fmarx2000, 1. Du kannst einen Beitrag noch 15 Minuten lang editieren. 2. Fullquotes sind nicht notwendig. Zitiere nur den Teil, auf den Du Dich beziehst. 3. Bevor Du einen solchen Ton anschlägst, solltest Du Deine eigenen Angaben auf Fehler prüfen, denn das: Originally posted by fmarx2000 a-b+c <> a - ( b +c )ist falsch. Das kann ja nicht wahr sein.Denke ich auch. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Hexagon Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Hiho, sagt mal, steh ich auf dem Schlauch oder was? a-b+c <> a - ( b +c ) Also: a-b+c = a-(b-c) Und: a-(b-c) != a-(b+c) Warum ist das dann falsch?:confused: Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TAZttDevil Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Hi... ich denke auch, das das Ergebnis nur zwei sein kann... denn: Eine logische Addition ist eine binäre verundung mit Übertrag. PUNKT!! eine Subtraktion dagenen ist eine adition mit einer negierten Zahl. PUNKT! d.h. Ein Proz oder Compiler kann nur addieren und multiplizieren (ausnahme sind Divisionen durch vielfache von 2, die durch einen einfachen Shift ausgeführt werden). Für unsere Rechnung heisst das: d = a - b + c ---> d = a + (- + c = a + c + (- = (- + a + c..... uns siehe da, die Reihenfolge der abarbeitung ist vollkommen unerheblich (Kommutativ-Gesetz).. sagt mir, wenn ich mich täusche.. Gruß Taz PS schon doof, wenn man dann den Post zweimal editiert... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Hexagon Hiho, sagt mal, steh ich auf dem Schlauch oder was? Also: a-b+c = a-(b-c) Und: a-(b-c) != a-(b+c) Warum ist das dann falsch?:confused: Das stimmt ja auch. Aber da a-b+c <> a - (b+c) kommen auch unterschiedliche Ergebnisse raus. Einmal 2 und dann die 0. aber a-(b-c) <> a-(b+c) weil: a-(b-c) = a - b + c a - (b+c) = a- b -c DAS MINUS VOR DER KLAMMER ÄNDERT EINIGES. Wenn ich ein Minus vor der Klammer habe und ich diese weglassen will, dann muss ich die Vorzeichen in der Klammer ändern .. so habe ich das mal gelernt. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Klotzkopp Hallo fmarx2000, 1. Du kannst einen Beitrag noch 15 Minuten lang editieren. 2. Fullquotes sind nicht notwendig. Zitiere nur den Teil, auf den Du Dich beziehst. 3. Bevor Du einen solchen Ton anschlägst, solltest Du Deine eigenen Angaben auf Fehler prüfen, denn das: ist falsch. Denke ich auch. Wenn aber a-b+c = a - (b+c) ist dann müsste ja das Gleiche rauskommen. 3-2+1 = 3 - (2+1) 3-2+1 = 3 - 3 2 = 0 .... und was jetzt ? Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by fmarx2000 Wenn aber a-b+c = a - (b+c) ist dann müsste ja das Gleiche rauskommen. Vielleicht reden wir aneinander vorbei. a-b+c = a-(b+c) ist falsch. Das brauchst Du mir nicht zu beweisen In Deinem Beitrag schien es mir nur so, dass Du behauptet hättest, das sei richtig. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Klotzkopp Vielleicht reden wir aneinander vorbei. a-b+c = a-(b+c) ist falsch. Das brauchst Du mir nicht zu beweisen In Deinem Beitrag schien es mir nur so, dass Du behauptet hättest, das sei richtig. Das habe ich nicht behauptet aber ich wundere mich warum sich der Originalposter wundert das bei a-b+c was anderes rauskommt als bei a - (b+c) . Es sind ja wohl offensichtlich zwei verschiedene Gleichungen deswegen wird das Ergebnis ja auch unterschiedlich sein. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Orffi Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Das Problem aus der Sicht der diskreten Mathematik: Der Ausdruck a - b ist eine Abkürzung für a + -b, wobei -b das additiv Inverse zu b ist. Die natürlichen Zahlen reichen also nicht aus, da bei den natürlichen Zahlen nicht für alle Elemente ein additiv Inverses in der Menge der natürlichen Zahlen existiert. Die Menge der ganzen Zahlen leistet dies. Die ganzen Zahlen bilden die algebraische Struktur eines Ringes (die natürlichen Zahlen sind eine Gruppe). Es gibt ein paar Axiome, die ein Ring erfüllen muß. Das hier entscheidene ist, daß ein Ring R (in diesem Fall Z für die ganzen Zahlen mit der Operation + eine kommutative Gruppe ist. Das bedeutet für uns: (a++c = a+(b+c) a+0 = 0+a a+(-a) = (-a)+a = 0 a+b = b+a Für uns sieht die Sache nun folgendermaßen aus: a-b+c = a+(-+c. Da Z mit + eine kommutative Gruppe ist, kann ich es beliebig umsortieren. Auf jeden Fall ist für a=3, b=2 und c=1 das Ergebnis immer 2! Zum Thema UPN: a-b+c ist kein gültiger Ausdruck für UPN. Die Aussage a-(b+c) = a-b+c ist in der Tat falsch, da diese Aussage für alle Bellegungen a,b,c element Z gelten muß. Um zu zeigen, daß die Aussage nicht gilt, brauche ich nur ein Gegenbeispiel: a=2,b=5,c=5: 2-(5+5) = 2 - (10) = -8 2-5+5 = 2-0 = 2 2 != -8, damit ist die Aussage falsch! HTH Jan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Danke !!! Erinnert mich irgendwie an meine Algebravorlesung ... leider fast alles wieder vergessen ... aber zum Grossteil kann ich es doch irgendwie nachvollziehen. Der Kern des Problems war ja das: a - b +c <> a - (b+c) ist und somit das Ergebnis der jeweiligen Gleichung auch anders sein muss. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jaraz Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Hallo, wenn du schon mit UPN anfängst, dann auch im richtigen Zusammenhang. Bei der UPN geht es darum, komplexe Formeln ohne Klammern anzugeben. Dafür wird alles hintereinander geschrieben, wobei: -Zahlen Operanden sind und -Operatoren Verknüpfungen zwischen 2 Operanden beschreiben . Ein Operator wirkt auf die beiden Operanden direkt vor ihm. Die Anwendung eines Operators auf seine Operanden wird als Einheit betrachtet und ist wieder ein Operand. Demnach würde aus: a-b+c=d; folgendes werden: ab-c+=d Ist in diesem Fall also sehr sinnlos, da keine Klammern existieren. Anderes Beispiel: (nicht von mir) 1 2 + 3 / 4 * 5 6 - + = ((((1 2 +) 3 /) 4 *) (5 6 -) +) Klammerung durch Operatoren erzungen = ((((1 + 2) / 3) * 4) + (5 - 6)) Infix-Notation = 3 Gruß Jaraz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TAZttDevil Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by Orffi Der Ausdruck a - b ist eine Abkürzung für a + -b, wobei -b das additiv Inverse zu b ist HTH Jan Das ist in der Mathematik richtig und bei Prozessoren erst recht, da diese nur addieren können... es gibt zwar auch den sub befehl, intern wird jedoch auch er als addition mit einer negierten Zahl gesehen... siehe mein Statement oben.. gruß Taz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fmarx2000 Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 Originally posted by TAZttDevil Das ist in der Mathematik richtig und bei Prozessoren erst recht, da diese nur addieren können... es gibt zwar auch den sub befehl, intern wird jedoch auch er als addition mit einer negierten Zahl gesehen... siehe mein Statement oben.. gruß Taz Soviel ich weiss wird das Zweierkomplement gebildet und dann addiert was einer subtraktion gleichkommt. Frank Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TAZttDevil Geschrieben 23. Oktober 2002 Teilen Geschrieben 23. Oktober 2002 japp.. genau so ist es... (denn das zweierkomplement einer zahl enspricht ihrem negativem) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Fiesek Geschrieben 23. Oktober 2002 Autor Teilen Geschrieben 23. Oktober 2002 Nun will ich mal ein bisschen zur Aufklärung beitragen. Ich bin weder zu doof für Mathematik (eckige Klammer vor runde Klammer vor Punktrechnung vor Strichrechnung, gleiche Operanden sind gleichberechtigt) noch möchte ich dieses Board mit dämlichen Postings füllen. Ich habe hier eine Tabelle aus eine Buch vorliegen, welche aussagt, dass nacheinander auftretende gleichrangige Operatoren in einem Ausdruck gemäß Definition (+ vor -) von links nach rechts abgearbeitet werden. Ich lese dies und frage meinen Dozenten. Der sagt, dass es sich um irgendeine polnische Notation handelt und das Maschinen eigentlich so rechnen wollen, wir sie aber softwaregesteuert auf den menschlichen Rechenweg bringen. Nun lese ich Eure Postings zum Thema UPN und denke, dass UPN dann wohl doch ganz was anderes sein muss, gell? Ich war immer der Meinung, Matheregeln sind Matheregeln. So, und nun an Kameraden wie z.B fmarx2000. :eek: Woher kommt nur diese große Klappe! Es ist ziemlich einfach sich als Fachmann in einem Gebiet hinzustellen und über andere Gericht zu halten von wegen Hauptschule und so. Ich dachte, dies sei ein Fachforum für Leute vom Fach und die die es werden wollen und nix für Dummschwätzer, welche am liebsten noch beleidigend werden übers Forum. Glückwunsch, aus Dir sprüht ja gradezu der Mut. Ich steh zwar kurz vor dem Berufsabschluß, aber alles wissen kann ich auch nicht, also wollte ich mich erkundigen und den Fall für mich und vieleicht andere mit dem selben Prob klären. Entweder anständige Postings und ordentliche Diskussionen oder Klappe halten. Aus welchem Buch diese Tabelle stammt reich ich noch nach, muss erst noch nachfragen. Es ist also Fakt, der Prozessor würde bei so einer Aufgabe hinten eine 2 liefern, richtig? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.