AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ungültiger Extended-Value

Ein Thema von matthiasl · begonnen am 17. Feb 2006 · letzter Beitrag vom 19. Feb 2006
Antwort Antwort
Benutzerbild von matthiasl
matthiasl

Registriert seit: 30. Okt 2003
Ort: Nienburg
14 Beiträge
 
Delphi 2007 Enterprise
 
#1

ungültiger Extended-Value

  Alt 17. Feb 2006, 03:06
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:
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 1: Kann mir jemand erklären, wie es eine Extended-Variable geben kann, die keinen gültigen Wert enthält?

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

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: ungültiger Extended-Value

  Alt 17. Feb 2006, 12:36
Zitat:
Frage 1: Kann mir jemand erklären, wie es eine Extended-Variable geben kann, die keinen gültigen Wert enthält?
Ja, durch eine nicht definierte Rechnung. sqrt(-3) wäre zum Beispiel keine (relle) Zahl, oder ?
http://de.wikipedia.org/wiki/NaN

Zitat:
Frage 3: Wie kann es zu solchen Werten kommen? Gibt es andere Leute, die aus einer ansonsten intakten Access-Datenbank soetwas rausgelesen haben?
NaN wird auch gerne für "undefiniert" oder "nicht angegeben" verwendet ...

Zitat:
Frage 2: Kann mir jemand erklären, woran man solche Werte identifizieren kann? Eine Funktion wie "isValidFloat(e:Extended):Boolean" wäre das Ziel.
Ja, das sind spezielle Konstanten, um spezielle Zahlen auszudrücken ...
http://de.wikipedia.org/wiki/IEEE_75...tellbare_Werte

Folgendes Beispiel sollte dir z.B. minus unendlich geben
Delphi-Quellcode:
 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));
Daraus können wir sagen, dass momentan das höchste Bit das Vorzeichen ist, dann 2 Bytes Exponent folgen und der Rest ist Mantisse
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: ungültiger Extended-Value

  Alt 17. Feb 2006, 13:03
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
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von matthiasl
matthiasl

Registriert seit: 30. Okt 2003
Ort: Nienburg
14 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: ungültiger Extended-Value

  Alt 17. Feb 2006, 13:13
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: ungültiger Extended-Value

  Alt 17. Feb 2006, 13:30
Delphi-Referenz durchsuchenIsInfinite
Delphi-Referenz durchsuchenIsNan
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: ungültiger Extended-Value

  Alt 17. Feb 2006, 13:37
Genau ... folgender Code:
Delphi-Quellcode:
uses Math;

function IsValid (e: Extended): Boolean;
begin
  Result := (not IsNan (e)) and (not IsInfinite(e));
end;
  Mit Zitat antworten Zitat
Benutzerbild von matthiasl
matthiasl

Registriert seit: 30. Okt 2003
Ort: Nienburg
14 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: ungültiger Extended-Value

  Alt 18. Feb 2006, 07:19
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:
  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;
Herzlichen Dank nochmal.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#8

Re: ungültiger Extended-Value

  Alt 18. Feb 2006, 20:59
Hast du auch uses Math; beachtet ?

Weil das müsste auch dei Delphi 5 schon dabei sein ...
  Mit Zitat antworten Zitat
Benutzerbild von matthiasl
matthiasl

Registriert seit: 30. Okt 2003
Ort: Nienburg
14 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: ungültiger Extended-Value

  Alt 19. Feb 2006, 04:46
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:57 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