![]() |
Re: Warum keine Exception bei Division durch 0
OK, ich glaub das Problem ist doch nicht so tragisch.
Delphi-Quellcode:
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.
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; Gruß, EDIT: Danke noch an alle, und Luckies Erklärung scheint mir sehr einleuchtend.. |
Re: Warum keine Exception bei Division durch 0
d := 0/0 wird wieder wegoptimiert. Guck mal, ob ein blauer Punkt vor der Zeile am Rand ist.
|
Re: Warum keine Exception bei Division durch 0
Zitat:
|
Re: Warum keine Exception bei Division durch 0
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 |
Re: Warum keine Exception bei Division durch 0
Zitat:
|
Re: Warum keine Exception bei Division durch 0
Zitat:
- Fließkommaarithmetik wird von der Fließkommaeinheit des Prozessors (der FPU) ausgeführt, die den IEEE-Standard 754 implementiert ( ![]() - 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:
Zitat:
- Robert |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz