Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

Popov 17. Apr 2014 15:15

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Meines Wissens nach (kann aber auch falsch sein) wählt Delphi für einer Konstante stets den kleinsten benötigten Variablentyp. Bei
Delphi-Quellcode:
if value <= 0.0 then
wäre 0.0 demnach Single, value Double, also 4 Byte gegen 8 Byte. Sollte jetzt nicht das Problem sein, denn Null ist Null, nur stellt sich die Frage ob value bis in den letzten Bit Null ist.

Was den try except Einschluss angeht, so weiß ich nicht ob das nötig ist. Negative Datumswerte wie hier
Delphi-Quellcode:
ShowMessage(DateTimeToStr(-5683.458));
führen nicht zum Fehler. Evtl. wäre IsValidDateTime interessanter als gegen Null zu prüfen. Auf jeden Fall bringt try except an der Stelle wenig.

Mikkey 17. Apr 2014 15:35

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
value ist bis in das letzt Bit 0

Zitat:

Zitat von Popov (Beitrag 1256036)
Auf jeden Fall bringt try except an der Stelle wenig.

Bitte entschuldige, aber was soll mir das jetzt bringen? Warum der Try/Except-Block da steht, habe ich bereits zweimal geschrieben. Ich finde es selbst unlogisch, dass ein Vergleich eines Double mit 0 ungültig sein soll.

Anscheinend gerät die Gleitkommalogik in irgendeinen komischen Zustand, der bei der ersten passenden Gleitkommaoperation in einer Exception mündet. Dieselbe Exception sorgt aber anscheinend für eine Bereinigung des Problems, so dass danach keine weiteren Exceptions fliegen.

Popov 17. Apr 2014 16:11

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von Mikkey (Beitrag 1256039)
Warum der Try/Except-Block da steht, habe ich bereits zweimal geschrieben.

Jep, hab nicht soweit gelesen.

Was passiert eigentlich wenn du das so machst?
Delphi-Quellcode:
var
  d: Double;
begin
  d := 0.0;
  if value <= d then

Dejan Vu 17. Apr 2014 17:35

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Also wenn ich die Zeichenkette 'Double' '=' und '0' sehe, werde ich mistrauisch und krame den ersten Satz heraus, den ich als Programmierer gelernt habe: Vergleiche Gleitkommazahlen nie auf Gleichheit und 0.0 ist nicht 0.0.

Ich denke, dein DateTimeToStr knallt hier, denn 0>0.0 (wissen wir ja, ne ;-) ) und dann wird versucht, daraus einen DateTime zu formatieren und das geht irgendwie in die Hose. Kann mich natürlich auch irren, und der Vergleich knallt.

Ich glaube, auch ein Wert von 0.1 (also irgendwie ein paar Minuten nach Mitternacht um die vorletzte Jahrhundertwende) ist ein legitimer Nix-Datum-Wert. Wieso also nicht einfach das hier versuchen
Delphi-Quellcode:
if value < 0.1 then

Mikkey 18. Apr 2014 15:18

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
@Dejan Vu:

Obwohl ich weiß, dass die Zahlen 0 und 1 exakte Repräsentierungen in jedem Fließkommasystem haben, hatte ich Deinen Vorschlag schon selbst ausprobiert - mit demselben Effekt.

Nochmal: Es ist nicht der DateTimeToStr, der knallt, sondern der Vergleich selbst! In Vorschlag von Himitsu was es der IntToHex.

Da nach dem ersten Knall kein weiterer folgt, vermute ich, dass das Problem nichts mit der Zahlvariablen zu tun hat, sondern mit dem Fließkommasystem selbst.

@Popov:

Kann ich aktuell nicht ausprobieren, erst am Di wieder. Bin aber felsenfest davon überzeugt, dass damit genau dasselbe passiert.

Dejan Vu 18. Apr 2014 15:37

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Zitat:

Zitat von Mikkey (Beitrag 1256173)
Nochmal: Es ist nicht der DateTimeToStr, der knallt, sondern der Vergleich selbst! In Vorschlag von Himitsu was es der IntToHex.

Das gips doch nich. Ich hatte gehofft, das Du dich geirrt hast. Mein Weltbild gerät ins Wanken.

Klaus01 18. Apr 2014 15:41

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
.. vielleicht kann man zum Vergleichen auch compareDateTime verwenden.

Grüße
Klaus

himitsu 18. Apr 2014 15:48

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Und das zeigt auch nichts an?
Delphi-Quellcode:
var
  P: PByte;
  i: Integer;
  S: string;
begin
  try
    if value <= 0.0 then
      Result := ''
    else
      try
        Result := DateTimeToStr(value);
      except
        on E: Exception do
          ShowMessage('ungültiges Datum: ' + E.Message);
      end;
  except
    on E: Exception do begin
      P := @value;
      for i := 0 to 7 do
        try
          S := S + IntToHex(P[i], 2);
        except
          S := S + '**';
        end;
      ShowMessage('ungültige Zahl: "' + S + '" - ' + E.Message);
    end;
  end;
end;

Popov 18. Apr 2014 17:14

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
@Mikkey

Kann es sein, dass du irgendwo eine spezielle Compilerdirektive nutzt? Mir fällt auf die Schnelle keine ein die zu der Fehlermeldung führen würde, aber wenn du schreibst, dass der Fehler nur einmal vorkommt, dann muss danach irgendetwas passieren, damit es kein weiteres Mal vorkommt. Vielleicht findet beim ersten Aufruf eine Bereichsprüfung statt, die beim weiteren Mal abgestellt ist.

Ich weiß, das Ganze ist etwas weit hergeholt, aber theoretisch möglich.

Namenloser 18. Apr 2014 17:52

AW: Ungewöhnliche ungültige Gleitkommaoperation
 
Ich würde mir mal den Wert von
Delphi-Quellcode:
Get8087CW()
ausgeben lassen. Außerdem, könntest du mal einen Breakpoint auf das
Delphi-Quellcode:
begin
setzen, in die Assembler-Ansicht wechseln und den Assembler-Code kopieren und hier posten? Und außerdem mal in der Assembler-Ansicht noch mal Anweisung für Anweisung durchsteppen und gucken, wo genau er abbricht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.
Seite 2 von 4     12 34      

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