AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Warum keine Exception bei Division durch 0
Thema durchsuchen
Ansicht
Themen-Optionen

Warum keine Exception bei Division durch 0

Ein Thema von Jelly · begonnen am 19. Nov 2004 · letzter Beitrag vom 24. Nov 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Warum keine Exception bei Division durch 0

  Alt 19. Nov 2004, 14:22
OK, ich glaub das Problem ist doch nicht so tragisch.

Delphi-Quellcode:
procedure TForm1.cmd1Click(Sender: TObject);
var
 a, b, c, d : double ;
begin
     a := 0 ;
     b := 0 ;
     c := a/b ; // -> hier krieg ich ne Exception ;
     d := 0/0 ; // -> und hier nicht
     showmessage (floatToStr(c)) ;
end;
0/0 akzeptiert er also, a/b zum Glück nicht. Da in meinem Programm natürlich nirgends direkt 0/0 steht, sondern ich eben nur mit Variablen arbeit, müsst ich in der Simulation natürlich eine Exception kriegen. Da dies aber nicht der Fall ist, muss ich den Fehler wohl sonstwo suchen.

Gruß,


EDIT: Danke noch an alle, und Luckies Erklärung scheint mir sehr einleuchtend..
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Warum keine Exception bei Division durch 0

  Alt 19. Nov 2004, 14:35
d := 0/0 wird wieder wegoptimiert. Guck mal, ob ein blauer Punkt vor der Zeile am Rand ist.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#13

Re: Warum keine Exception bei Division durch 0

  Alt 19. Nov 2004, 14:38
Zitat von Luckie:
Guck mal, ob ein blauer Punkt vor der Zeile am Rand ist.
Nöö, ist keiner. Womit ich jetzt auchverstanden hätt, was diese blaue Punkte überhaupt bedeuten
  Mit Zitat antworten Zitat
woki

Registriert seit: 29. Mär 2003
563 Beiträge
 
Delphi 2006 Architect
 
#14

Re: Warum keine Exception bei Division durch 0

  Alt 19. Nov 2004, 15:10
Hi,

also nochmal zusammenfassend, damit auch flüchtige zukünftige Leser das richtig verstehen:

Selbstverständlich löst Delphi bei Division durch Null immer auch bei allen Gleitkommazahlen einen Laufzeitfehler (EZeroDivide) aus.
Da eine Division durch Null mathematisch gar nicht definiert ist, was sollte Delphi denn da auch für ein Ergebnis zurückliefern.
Aber Voraussetzung ist natürlich, daß der Code überhaupt ausgeführt wird, und nicht z.B. vom Optimizer wegoptimiert wurde. Von daher ist es sehr sinnvoll, beim Debuggen den Optimizer abzuschalten,
und wenn man nicht debugged beim Entwickeln den Debugger auszuschalten, das kostet nämlich eventuell sehr viel Rechenzeit. Ein Hinweis noch: Wenn einem die IDE zu langsam wird, gibt es noch einige Dinge, die man abschalten kann, wenn man sie gerade nicht braucht.

Grüße
Woki
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#15

Re: Warum keine Exception bei Division durch 0

  Alt 19. Nov 2004, 17:13
Zitat von Luckie:
Dein Beispiel-Code wird gar nicht ausgeführt. Der Compiler ist ja nicht blöd, er sieht, dass du die Varaible nie benutzt und optimiert sie weg.
Luckie, das war echt gut. Ist mir gar nicht aufgefallen. Da sieht man mal wieder, daß man sich auch zu Tode optimieren kann.
Gruß
Hansa
  Mit Zitat antworten Zitat
Robert Rossmair

Registriert seit: 22. Nov 2004
1 Beiträge
 
#16

Re: Warum keine Exception bei Division durch 0

  Alt 24. Nov 2004, 17:16
Zitat von woki:
Selbstverständlich löst Delphi bei Division durch Null immer auch bei allen Gleitkommazahlen einen Laufzeitfehler (EZeroDivide) aus.
Falsch. Weder löst Delphi die Exception aus, noch wird diese immer ausgelöst:
- Fließkommaarithmetik wird von der Fließkommaeinheit des Prozessors (der FPU) ausgeführt, die den IEEE-Standard 754 implementiert (http://grouper.ieee.org/groups/754/). Es ist auch die FPU, die ggf. eine Exception wirft. Delphi verpackt diese nur ansprechend.
- Fließkomma-Exceptions lassen sich in der FPU ausmaskieren, die Unit Jcl8087 stellt dazu Funktionen zur Verfügung. Ist eine Exception maskiert, wird statt dessen ein Flag im Statuswort der FPU gesetzt (Jcl8087: GetPending8087Exceptions) und evtl. ein spezieller Wert zurückgeliefert. Siehe dazu auch die Erläuterungen zum Typ JclMath.TFloatingPointClass in der Online Hilfe der JCL.
Die Exception bleibt latent, bis entweder die Maskierung aufgehoben wird, oder die latenten Exceptions gelöscht werden (Jcl8087: ClearPending8087Exceptions). Hebt man die Maskierung auf, ohne die Löschung vorzunehmen, dann werden die latenten Exceptions ausgelöst - evtl. an einer Stelle im Code, die nichts mit der Ursache zu tun hat.
Zitat von woki:
Da eine Division durch Null mathematisch gar nicht definiert ist, was sollte Delphi denn da auch für ein Ergebnis zurückliefern.
+/-Unendlich, falls Zähler <> 0, oder ein NaN (not a number), falls Zähler = 0.
Zitat von woki:
Aber Voraussetzung ist natürlich, daß der Code überhaupt ausgeführt wird, und nicht z.B. vom Optimizer wegoptimiert wurde.
Dass im gegebenen Fall irgendwelcher Beispielcode nicht kompiliert wird, ist ganz unerheblich. Es gäbe in keinem Fall eine Exception, weil zur Laufzeit(!) keine Division ausgeführt wird. Ausdrücke, die ausschließlich Konstanten enthalten, rechnet nämlich der Compiler aus.

- Robert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz