Morgen zusammen, Was passiert bei einem z.B. ATMEGA32, wenn ich durch "0" teile oder eine Zahl durch "0" teile? Kann es sein dass sich der µC aufhängt? Habe im Moment ein ähnliches Problem, kann aber grad leider nicht testen, wie sich der µC verhält. Mfg Mel
>Kann es sein dass sich der µC aufhängt?
Da keiner der Atmels eine Division in Hardware unterstützt, kommt das
Verhalten bei Division durch Null allein auf den verwendeten Algorithmus
an!
>Heisst im Klartext? >Kann es sein dass sich der µC aufhängt? "Vielleicht" Sollte aber in der Doku des BASCOM-Compilers stehen.
BASCOM-AVR -Dokumentation: "Overflow and division by zero Division by zero, produces an error. At the moment no message is produced, so you have to make sure yourself that this won't happen." Hört sich ein wenig danach an, als wenn das Verhalten nicht definiert sei.
@Kai, war zu langsam, wollt' auch gerade den Auzug aus der Bascom Hilfe posten :D @sirmel, ist doch eigentlich selbstverständlich daß man im Code sicherstellt, daß so etwas nicht passiert. Was soll den der µC sonst machen ? Errorhandler aufrufen, rot glühen oder eine Messagebox mit Division by Zero Meldung mit Buttons Ja, Nein, Vielleicht anzeigen ?
Hallo, wieso? Steht doch da: er fällt auf die Schnauze, sagt es aber keinem. ;) Anders ausgedrückt: vor Aufruf der Division den Divisor auf 0 testen und wenn ja, nicht dividieren. Gruß aus Berlin Michael
>eine Messagebox mit Division by Zero Meldung >mit Buttons Ja, Nein, Vielleicht anzeigen ? Geht das? Kann man da verschiedene Farbschemen wählen? ;-)
Er könnte den Fehler stillschweigendd ignorieren oder man könnte ihm (wie ich es von Basic kenne) mit einem
1 | On Error Resume Next |
2 | oder |
3 | On Error Goto AllesKaputt |
einen Hinweis geben, was im Fehlerfall zu tun ist - ähnlich einer Exception. Aber die Doku ist, was die Fehlerbehandlung angeht extrem mies. Im einfachen Fall von Division durch null, ist aber eine Prüfung durch den Entwickler wirklich nicht zu viel verlangt.
>Geht das? Kann man da verschiedene Farbschemen wählen? >;-) Nur bei einem RGB-Oszilloskop als Monitor ;)
Matthias Lipinsky wrote:
> Geht das? Kann man da verschiedene Farbschemen wählen?
Ja, das kann man über die Betriebsspannung einstellen:
Bei 5V reicht es allerdings nur für eine niedrige Farbtemperatur (also
Rot-Töne). Wenn die (Farb-) Temperatur höher sein soll, musst du schon
auf >12V gehen.
Ok vielen Dank für die unter den vielen Textergüssen doch vorhandenen produktiven Antworten. Werd das Programm dann mal abändern, sodass eine Division durch "0" nicht mehr passiert.
> unter den vielen Textergüssen
Lies die "Textergüsse" bitte in zwei Jahren (mit etwas mehr MC-Wissen)
nochmal, dann wirst Du feststellen, dass die sehr konstruktiv sind.
Alternativ hätte man es Dir auch sehr direkt sagen können, dies wiederum
hättest Du aber als Beleidigung auffassen können. Also: Humor
einschalten, mal über sich selbst lachen, Schlüsse draus ziehen und gut.
;-)
...
Eigentlich Schade, dass es da in den Status-Bits des Controllers kein Flag gibt... Gibts ja sonst auch für jeden Mist (Carry-Bit, Zero-Bit etc...)
>Eigentlich Schade, dass es da in den Status-Bits des Controllers kein >Flag gibt... Gibts ja sonst auch für jeden Mist (Carry-Bit, Zero-Bit >etc...) Klar gibts das. Du hast es doch selbst aufgezählt: >Zero-Flag Es ist aber erst nach der Rechenoperation aktuell.
Wo fehlt denn der Humor? Hätte auch blöd rumpampen können...was mir letzendlich nicht weitergebracht hätte=). Für mich ist die Bezeichung "Textergüsse" schon humorvoll genug. Direkt sagen ist vllt besser angebracht...ich jedenfalls versuche präzise Antworten zu geben und mich dabei nicht über den Fragenden lustig zu machen, auch wenn die Fragen manchmal etwas banal sind :).
Wieder was dazugelernt... Dachte, das Zero-Flag wird nur dann gesetzt, wenn das Ergebnis einer Rechnung 0 ist; also sowas wie y = 4+2-6. Aber wenn das bei ner Division durch 0 gesetzt wird, isses auch brauchbar. z = x / y; wenn x != 0 obwohl Zero-Flag gesetzt (d.h. z = 0), war y wohl 0.
>Wieder was dazugelernt..
Nein
Du hast recht. Das Zeroflag wird gesetzt, wenn bei einer Berechnung Null
als Ergebnis herauskommt.
Mit Berechnung ist allerdings eine mathematische/logische Operation
der ALU gemeint. Dazu gehört allerdings nicht die Division! Sondern
nur die Befehle, die in der Instruction summary im Datenblatt stehen.
ok, schon wieder überschrieben g. Aber ist wohl eh effizienter, davor auf 0 zu prüfen, als erst mal zu dividieren und dann zu schauen, obs überhaupt was gebracht hat.
@sirmel, zum Glück ist das kein Forum, bei dem Lachen im Keller angesagt ist, und würdest Du "rumpampen", ginge natürlich die Bereitschaft der anderen Forumsteilnehmer Dir zu helfen gegen Null. Div / 0 ? :-) Ein bisserl hast Du sicher um diesen Art Humor gebettelt, denn a) würde man durch bloßes Nachdenken drauf kommen, und b) steht die Antwort in der Bascom Hilfe. Zwar nicht besonders ausführlich, aber dennoch ausreichend deutlich. Die Fließkomma Routine zu debuggen war mir im Monment zu aufwändig, aber immerhin hab' ich die Int Division im Disassembler mal angeschaut, die produziert zwar nix Gescheites, hängt sich aber auch nicht auf, wenn Divisor = 0 ist.
Naja wär ich durch bloßes Nachdenken drauf gekommen hätt ich dir ganze bestimmt nicht deine Zeit gestohlen;). In der Hilfe hätte ich nachschauen können...da hast du Recht. Aber aufgrund der Tatsache dass ich ja jetzt bestens Bescheid weiss, sollten wirs dabei belassen oder^^?
Du stiehlst keine Zeit, jeder der hier postet gibt seine Zeit freiwillig. Aber natürlich, gern.
Der Regelfall wird wohl sein, vor der Division den Divisior auf 0 zu testen. In der zb. Grafikprogrammierung hat eine versuchte Division durch 0 fast immer irgendeinen geometrischen Sonderfall zur Ursache. Bsp: Der Schnittpunkt zweier (unendlichen Geraden) ergibt sich durch (ax-bx)*nby - (ay-by)*nbx t = ---------------------------- nay*nbx - nax*nby Ist der Divisor gleich 0, sind die beiden Geraden parallel und es existiert kein Schnittpunkt. Nun kommt es aber insbesondere durch Rechen und Rundungungenauigkeiten oft vor, dass der Divisor nicht exakt gleich 0 sondern eine sehr kleine Zahl ergibt. In so einem Fall werden auch Ergebnisse kleiner als ein gewisses Epsilon als 0 gewertet. Für so gut wie alle praktischen Zwecke ist ein 5 Lichtjahre entfernter Schnittpunkt gleichbedeutend mit 'kein Schnittpunkt'.
>als ein gewisses Epsilon als 0 gewertet.
Ah ja..
"Sei epsilon kleiner Null.."
In der Informatik gibt es einen Trick bei der Division durch 0. Einfach eine If-Abfrage auf 0 machen und falls der Divisor tatsächlich gleich 0 ist, dann teile einfach durch -0.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.