![]() |
ungültiger Extended-Value
Schönen guten Tag erstmal,
ich habe gerade beim Übertragen von Access(DAO)-Daten in MySql einen Extended-Wert gefunden, der sich beim Kopieren nicht in Zeichen umwandeln ließ. Mit einem Hex-Editor hab ich den seltsamen Wert gesucht und gefunden.
Delphi-Quellcode:
Frage 1: Kann mir jemand erklären, wie es eine Extended-Variable geben kann, die keinen gültigen Wert enthält?
var
e:Extended; p:^Byte; begin p:=@e; p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$C0; inc(p); p^:=$FF; inc(p); p^:=$FF; inc(p); ShowMessage(FloatToStr(e)+' und '+VarToStr(e)); end; Frage 2: Kann mir jemand erklären, woran man solche Werte identifizieren kann? Eine Funktion wie "isValidFloat(e:Extended):Boolean" wäre das Ziel. Frage 3: Wie kann es zu solchen Werten kommen? Gibt es andere Leute, die aus einer ansonsten intakten Access-Datenbank soetwas rausgelesen haben? Jeder auch noch so kleine Ansatz/Idee wird hilfreich sein. |
Re: ungültiger Extended-Value
Zitat:
![]() Zitat:
Zitat:
![]() Folgendes Beispiel sollte dir z.B. minus unendlich geben ;)
Delphi-Quellcode:
Daraus können wir sagen, dass momentan das höchste Bit das Vorzeichen ist, dann 2 Bytes Exponent folgen und der Rest ist Mantisse ;)
p:=@e;
p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$00; inc(p); p^:=$80; inc(p); p^:=$FF; inc(p); p^:=$FF; inc(p); ShowMessage(VarToStr(e)); |
Re: ungültiger Extended-Value
NaN entsteht außerdem, wenn sich ein Wert nicht ohne Widersprüchen berechnen lässt.
Beispiel +Inf * 0 1. Regel: 0 multipliziert mit x ergibt immer 0. 2. Regel: +Inf multipliziert mit x (positiv) ergibt immer +Inf. => Widerspruch |
Re: ungültiger Extended-Value
Danke, Julius.
Das trifft den Punkt genau. Ich hoffe, das anderen damit diese Fehlersuche erspart bleibt. Ich werde eine IsValid-Routine schreiben und sie hier posten. |
Re: ungültiger Extended-Value
|
Re: ungültiger Extended-Value
Genau ... folgender Code:
Delphi-Quellcode:
:mrgreen:
uses Math;
function IsValid (e: Extended): Boolean; begin Result := (not IsNan (e)) and (not IsInfinite(e)); end; |
Re: ungültiger Extended-Value
Danke, Leute.
Leider muß ich sagen, daß ich Delphi 5.0 benutze und die Funktionen "IsNan" und "IsInfinite" anscheinend erst später dazugekommen sind. Ich habe mich zu folgenden Routinen durchgerungen, um das Transportproblem DAO->MySql zu beseitigen. Dabei war eine Überlegung: Ein Fehler ist schlecht, ein unsichtbarer Fehler eine Katastrophe. Ich wollte also das Problem nicht einfach verstecken, sondern mir die Möglichkeit offen halten, einen eventuell ursächlichen Fehler irgendwann auch mal zu finden.
Delphi-Quellcode:
Herzlichen Dank nochmal. :-)
procedure ValidateSingle(var Value:Single);
// 4 Byte Float-Value // SEEEEEEE MMMMMMMM MMMMMMM MMMMMMM var c:Cardinal; begin c:=Cardinal(Pointer(Integer(@Value)+0)^); if ((c shr 24) and $7f)=$7f then begin case ((c shr 22) and 3) of 2 : begin // INF if ((c shr 31) and 1)=0 then begin // Positiv if MessageDlg('Es ist ein Wert von "positiv Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end else begin // Negativ if MessageDlg('Es ist ein Wert von "negativ Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; 3 : begin // NAN if MessageDlg('Es ist ein ungültiger Fließkomma-Wert aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; end; end; procedure ValidateDouble(var Value:Double); // 8 Byte Float-Value // SEEEEEEE EEEMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM var c:Cardinal; begin c:=Cardinal(Pointer(Integer(@Value)+4)^); if ((c shr 21) and $3ff)=$3ff then begin case ((c shr 19) and 3) of 2 : begin // INF if ((c shr 31) and 1)=0 then begin // Positiv if MessageDlg('Es ist ein Wert von "positiv Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end else begin // Negativ if MessageDlg('Es ist ein Wert von "negativ Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; 3 : begin // NAN if MessageDlg('Es ist ein ungültiger Fließkomma-Wert aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; end; end; procedure ValidateExtended(var Value:Extended); // 10 Byte Float-Value // SEEEEEEE EEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM var c:Cardinal; begin c:=Cardinal(Pointer(Integer(@Value)+6)^); if ((c shr 16) and $7fff)=$7fff then begin case ((c shr 14) and 3) of 2 : begin // INF if ((c shr 31) and 1)=0 then begin // Positiv if MessageDlg('Es ist ein Wert von "positiv Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end else begin // Negativ if MessageDlg('Es ist ein Wert von "negativ Unendlich" aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; 3 : begin // NAN if MessageDlg('Es ist ein ungültiger Fließkomma-Wert aufgetreten. Wollen Sie den Wert auf Null setzen?',mtConfirmation,[mbYes,mbNo],0)=idYes then Value:=0; end; end; end; end; procedure ValidateVariant(var Value:Variant); begin case tVarData(Pointer(@Value)^).VType of varSingle:ValidateSingle(tVarData(Pointer(@Value)^).VSingle); varDouble:ValidateDouble(tVarData(Pointer(@Value)^).VDouble); end; end; |
Re: ungültiger Extended-Value
Hast du auch uses Math; beachtet ?
Weil das müsste auch dei Delphi 5 schon dabei sein ... :gruebel: |
Re: ungültiger Extended-Value
Hallo Julius,
die Unit Math enthält bei Delphi 5 wirklich noch nicht diese Funktionen. Wie ist das bei Delphi 6 denn realisiert? (Wenn es ungesetzlich ist, hier Borland-Code zu posten, muß ich mir mein Delphi 6 eben mal wieder installieren.) Matthias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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