Fließkommadivision durch Null-Ausnahme in Delphi5

8

Meine App ist in Delphi5 geschrieben. Ich benutze madExcept, um Bugs aufzuspüren. Ich habe eine Ausnahme "Fließkomma-dvision durch Null" gefunden, wo es nicht sein sollte. Das Code-Segment, in dem es ausgelöst wird, lautet wie folgt:

%Vor%

wobei 'c' eigentlich immer den Wert '1' hat.

Die Stack-Ablaufverfolgung des Protokolls:

%Vor%

Ich hatte einmal eine andere Ausnahme, wo eine Division stattgefunden hat, aber der Divisor war eine Variable, die auch den Wert '1' hatte, als die Ausnahme auftrat. Das konnte ich debuggen und reproduzieren.

Meine Frage: Was fehlt mir? Gibt es einige falsche Positive über die Gleitkommadivision, die mir nicht bekannt sind?

Außerdem: Ich benutze keine C ++ - DLLs an den Ausnahmepunkten, da sie FP-Bereiche unterschiedlich behandeln (indem sie NaN oder +/- INF zurückgeben, anstatt eine Ausnahme auszulösen).

Alle Hinweise geschätzt.

    
simonescu 08.11.2011, 08:10
quelle

3 Antworten

8

Ich habe gerade den folgenden Code ausprobiert:

%Vor%

Er kompiliert und läuft wie erwartet in Delphi 5.

Ich schätze, dass die Division pro Null-Flag außerhalb Ihres Codes gesetzt werden kann (auch wenn Sie keine Verknüpfung zu C ++ - Code herstellen, Direct X aufrufen oder den gleichen Effekt haben), aber später in _Frac .

Der einzige Aufruf von Frac in der Standardimplementierung von Power() besteht darin, Frac(Exponent) = 0.0 zu testen.

Es gab eine Modifikation in der Implementierung von Frac zwischen Delphi 5 und Delphi 6.

Hier ist die Delphi 5 Version:

%Vor%

Hier ist die Delphi 6 Version:

%Vor%

Aus dem obigen Code erfahren Sie, dass die folgenden Befehle die verzögerten Ausnahmen ausgelöst haben, bevor Delphi 6 veröffentlicht wurde: Trunc, Frac, Ceil.

Ich nehme an, Sie hatten ein Problem mit Delphi 5, das mit Delphi 6 behoben wurde. Möglicherweise müssen Sie Ihre eigene Version von Power verwenden, wie diese:

%Vor%     
Arnaud Bouchez 08.11.2011, 09:03
quelle
2

Keine endgültige Antwort, aber ...

Fpu-bezogene Ausnahmen, bei denen dies nicht der Fall sein sollte, könnten damit zusammenhängen, dass der FPU-Stapel nicht ordnungsgemäß gelöscht wurde. Wir hatten ähnliche Probleme zu einem Zeitpunkt, obwohl wir ungültige Invalid Floating Point Operation-Ausnahmen hatten.

Dieser Artikel: Delphi Bug des Tages : FPU stack leak , wo jemand den Grund für eine Ungültige Gleitkommaoperationsausnahme ausfindig gemacht hat, die von S := S + '*'; ausgelöst wurde, half uns, das Problem zu lösen.

    
Marjan Venema 08.11.2011 08:36
quelle
0

Verwenden Sie TWebBrowser oder eine beliebige IE-Webbrowser-Komponente wie EmbeddedWB?

Wenn ja, könnte dies erklären: Ссылка

Es enthält auch etwas, das das Problem beheben könnte, auch wenn Sie keinen Webbrowser (Set8087CW) verwenden, wie der von Jeroen oben beschriebene Link beschreibt.

    
MikeD 08.11.2011 13:24
quelle