Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Ungewöhnliche ungültige Gleitkommaoperation (https://www.delphipraxis.net/180006-ungewoehnliche-ungueltige-gleitkommaoperation.html)

Mikkey 16. Apr 2014 15:10

Delphi-Version: 7

Ungewöhnliche ungültige Gleitkommaoperation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht kann mir ja jemand einen Tipp geben, was hier vorgeht.

Mit dem Einschließen in Try/Except macht das zwar keine Probleme, aber ich wüsste trotzdem gern, wodurch der Fehler verursacht wird und - wenn möglich - wie ich ihn von vornherein vermeiden kann.

Sherlock 16. Apr 2014 15:15

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Hast du mal versucht nur gegen 0 zu vergleichen, also ohne das ".0"?

Sherlock

himitsu 16. Apr 2014 15:21

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Was ist nun eigentlich der Fehler?
Oder ist das "Ungewöhnliche ungültige Gleitkommaoperation" die Fehlermeldung?

Und welchen Wert hat das Value und wo kommt der Wert her?

(z.B. mit NaN lässt sich keine Zahl vergleichen)

p80286 16. Apr 2014 15:25

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von himitsu (Beitrag 1255835)
Und was ist nun eigentlich der Fehler?

gerade mal ausprobiert
Delphi-Quellcode:
procedure pp(t:tdatetime);
begin
  if t<=0.0 then begin
    t:=t+1;
  end;
end;
kein Fehler, nichts!
(ach ja t=now)

Gruß
K-H

himitsu 16. Apr 2014 15:43

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von p80286 (Beitrag 1255836)
(ach ja t=now)

Solltest du dann nicht besser "-" rechnen, um auch mal bei kleiner 0 vorbei zu kommen? :angel:

Aber so lange in t eine "gültige" Fließkommazahl drin ist, gibt es keine Probleme.
Außer nach einer Weile ein eventuelle "Überlauffehler", aber diese Prüfung ist ja standardmäßig deaktiviert.

Zitat:

kein Fehler, nichts!
"Anwendung hängt", müsste da aber schon kommen. :lol:



Gültig:
- kein NaN, Infinity oder NegInfinity
- keine defekter/ungültiger "Wert" (im Gegensatz, zum z.B. Integer, ergibt, auf binärer Ebene, nicht jede Bitkombination einen gültigen "Wert")
- zwischen -MaxDouble und MaxDouble
- und nahe 0 nicht kleiner als MinDouble (nicht zwischen -MinDouble und MinDouble)

Mikkey 16. Apr 2014 15:54

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von Sherlock (Beitrag 1255833)
Hast du mal versucht nur gegen 0 zu vergleichen, also ohne das ".0"?
Sherlock

habbich, das 0.0 war einer der Vermeidungsversuche

Zitat:

Zitat von himitsu (Beitrag 1255835)
Was ist nun eigentlich der Fehler?
Oder ist das "Ungewöhnliche ungültige Gleitkommaoperation" die Fehlermeldung?
Und welchen Wert hat das Value und wo kommt der Wert her?
(z.B. mit NaN lässt sich keine Zahl vergleichen)

"value" ist 0, auch zu sehen im Tooltip, 0 soll dabei ein nicht-angegebenes Datum darstellen. Der Fehler ist das Auslösen der Exception "ungültige Gleitkommaoperation" an der mit dem Pfeil markierten Stelle.

himitsu 16. Apr 2014 16:14

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Nja, de Debugger zeigt die Werte nicht immer "optimal" an, ganz kleine Zahlen rundet der auch schonmal zu einer "glatten" 0
und vorallem mit "defekten" Werten kommt der nicht unbedingt klar. (wer konnt auch ahnen, daß sowas mal passieren könnte)

Ist das denn wirklich eine 0.000000000000000... ?

Was gibt der Code denn aus, wenn du ihn in deine Funktion einfügst?
Delphi-Quellcode:
var
  X: Int64 absolute Value;
begin
  ShowMessage(IntToHex(X, 16));
(PS: Strg+C funktioniert im Quellcode, in Compiler-/Debuggermeldungen und sogar in den Dialogen/Fehlermeldungen)


Delphi-Quellcode:
var
  T: TDateTime;
begin
  T := 0;
  if T < 0 then ;

  T := NaN; // absichtlich kaputte Zahl (definierter Zustand, welchen auch der Debugger versteht)
  if T < 0 then ;

Mikkey 16. Apr 2014 16:40

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von himitsu (Beitrag 1255843)
Nja, de Debugger zeigt die Werte nicht immer "optimal" an, ganz kleine Zahlen rundet der auch schonmal zu einer "glatten" 0
und vorallem mit "defekten" Werten kommt der nicht unbedingt klar. (wer konnt auch ahnen, daß sowas mal passieren könnte)

Ist das denn wirklich eine 0.000000000000000... ?

Zumindest sieht man im Stack an der Stelle (BP+8) zweimal "00000000"

Zitat:

Zitat von himitsu (Beitrag 1255843)
Was gibt der Code denn aus, wenn du ihn in deine Funktion einfügst?
Delphi-Quellcode:
var
  X: Int64 absolute Value;
begin
  ShowMessage(IntToHex(X, 16));
(PS: Strg+C funktioniert im Quellcode, in Compiler-/Debuggermeldungen und sogar in den Dialogen/Fehlermeldungen)

Der gibt garnichts aus, nur die Exception tritt wieder auf. Allerdings wird die Funktion in der Folge noch mehrfach aufgerufen und dabei erscheinen auch Msg-Boxes mit "0000000000000000" (ohne Exception).

PS: Im Quelltext schon, das übrige geht zumindest in meinem Delphi hier nicht.

himitsu 16. Apr 2014 17:40

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von Mikkey (Beitrag 1255846)
Der gibt garnichts aus, nur die Exception tritt wieder auf.

Das ganze läuft aber nicht in einem Thread? (wegen der MessageBox)

Ansonsten sieht es eher so aus, als wenn da irgendwas anderes total zerschossen wäre und nur hier zufällig erst einen Fehler ausgelöst wird, wenn sich nichtmal die MessageBox zeigt.

Mikkey 17. Apr 2014 08:30

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von himitsu (Beitrag 1255857)
Zitat:

Zitat von Mikkey (Beitrag 1255846)
Der gibt garnichts aus, nur die Exception tritt wieder auf.

Das ganze läuft aber nicht in einem Thread? (wegen der MessageBox)

Ansonsten sieht es eher so aus, als wenn da irgendwas anderes total zerschossen wäre und nur hier zufällig erst einen Fehler ausgelöst wird, wenn sich nichtmal die MessageBox zeigt.

Die Exception fliegt aus dem IntToHex, ich bin mit dem Debugger soweit in den Code hinuntergestiegen, wie noch benannte Calls erkennbar waren.

Heute habe ich nochmal die ursprünglichen Daten angesehen, das Feld enthält tatsächlich 8x00, drei darauf folgende Doubles, die mit NaN initialisiert wurden, 000000000000F8FF.

Das Programm hat zwar parallele Threads, die Daten (zum Zeitpunkt des Fehlers) stammen aus der eigenen Initialisierung, erst später kommen die Daten von einem anderen Prozess (per Pipe) - dann tritt der Fehler aber auch nicht mehr auf. Die Messageboxen werden dann anständig angezeigt.

Wie gesagt, der Try/Except umgeht das Problem vollständig, ich würde nur gern wissen, was denn an der Logik falsch ist. Unmittelbar nach dem Aufruf der Funktion mit diesem Wert, wird sie mit drei anderen Feldern des Records aufgerufen, die exakt gleich ( := 0; ) initialisiert werden. Dabei kommt keine Exception.

Ich habe auch versucht, die Werte mit NaN zu initialisieren und entsprechend abzufragen. Dann tritt die Exception nicht mehr in der Funkion auf, sondern irgendwann später und schlägt mit einer Meldung an der Oberfläche auf :-(


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
Seite 1 von 4  1 23     Letzte »    

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