www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Bascom durch "0" dividieren


Autor: M. G. (sirmel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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!

Autor: M. G. (sirmel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heisst im Klartext?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Heisst im Klartext?
>Kann es sein dass sich der µC aufhängt?
"Vielleicht"

Sollte aber in der Doku des BASCOM-Compilers stehen.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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 ?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>eine Messagebox mit Division by Zero Meldung
>mit Buttons Ja, Nein, Vielleicht anzeigen ?

Geht das? Kann man da verschiedene Farbschemen wählen?

;-)

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er könnte den Fehler stillschweigendd ignorieren oder man könnte ihm 
(wie ich es von Basic kenne) mit einem
On Error Resume Next
oder
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.

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Geht das? Kann man da verschiedene Farbschemen wählen?
>;-)

Nur bei einem RGB-Oszilloskop als Monitor ;)

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: M. G. (sirmel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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. 
;-)

...

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...)

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: M. G. (sirmel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :).

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: MeinerEiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: M. G. (sirmel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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^^?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du stiehlst keine Zeit, jeder der hier postet gibt seine Zeit 
freiwillig. Aber natürlich, gern.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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'.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>als ein gewisses Epsilon als 0 gewertet.

Ah ja..

"Sei epsilon kleiner Null.."

Autor: Kai G. (runtimeterror)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Noch einer zum Thema Arbeitssicherheit ...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.