AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Ungewöhnliche ungültige Gleitkommaoperation

Ungewöhnliche ungültige Gleitkommaoperation

Ein Thema von Mikkey · begonnen am 16. Apr 2014 · letzter Beitrag vom 24. Apr 2014
Antwort Antwort
Seite 1 von 4  1 23     Letzte » 
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#1

Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:10
Delphi-Version: 7
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.
Miniaturansicht angehängter Grafiken
ung_gleitkommaoperation.png  

Geändert von Mikkey (16. Apr 2014 um 18:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.799 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:15
Hast du mal versucht nur gegen 0 zu vergleichen, also ohne das ".0"?

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:21
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Apr 2014 um 16:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:25
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:43
(ach ja t=now)
Solltest du dann nicht besser "-" rechnen, um auch mal bei kleiner 0 vorbei zu kommen?

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.



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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Apr 2014 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#6

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 16:54
Hast du mal versucht nur gegen 0 zu vergleichen, also ohne das ".0"?
Sherlock
habbich, das 0.0 war einer der Vermeidungsversuche

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 17:14
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 ;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 17:40
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"

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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#9

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 16. Apr 2014, 18:40
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#10

AW: Ungewöhnliche ungültige Gleitkommaoperation

  Alt 17. Apr 2014, 09:30
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:28 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