Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 25 ist kleiner als 25? (https://www.delphipraxis.net/12701-25-ist-kleiner-als-25-a.html)

FBrust 2. Dez 2003 16:54


25 ist kleiner als 25?
 
Hallo,

in meinem Programm steht folgender Code:

Code:
if (dblWeight >= FieldbyName('intFrom5').AsFloat) and
                     (dblWeight < FieldbyName('intFrom6').AsFloat) then begin ...

Die Variablen haben folgende Inhalte:

dblWeight: 25,
intFrom5 : 15,
intFrom6 : 25,

Alle Variablen sind vom Typ float bzw. numeric.

Die erste Bedingung, also 25 >= 15 wird noch korrekt ausgewertet (true), aber die zweite Bedingung, die mit diesen Werten 25 < 25 lautet, wird auch mit true ausgewertet, so dass das Programm in den then-Zweig läuft.

Meine Frage: Müsste da nicht False rauskommen, 25 ist doch nicht kleiner als 25, oder? :gruebel:

Vielleicht habt ihr einen Tip.


Grüße
Frank

r_kerber 2. Dez 2003 16:59

Re: 25 ist kleiner als 25?
 
Hallo Frank,

wo kommt der Wert für dblWeight her? Falls Du diesen irgendwie berechnest, kann es doch sein, dass er den Wert 24,99999999999999 annimmt. Das ist rund 25 aber eben kleiner 25!

Sanchez 2. Dez 2003 17:01

Re: 25 ist kleiner als 25?
 
hallo,
Eventuell liegts an der Genauigkeit der Float-Zahlen. Ein Numeric ist glaub ich kleiner als double, wenn ich mich jetzt nicht irre.

FBrust 2. Dez 2003 17:08

Re: 25 ist kleiner als 25?
 
Hallo Sanchez,

danke für Deine Antwort.

Könnte tatsächlich sein, da muss ich mal sehen, inwieweit ich die Werte auf einen gemeinsamen Nenner bringen kann (evtl. muss ich Vor- und Nachkommastellen getrennt auswerten...).

Grüße

Frank

FBrust 2. Dez 2003 17:12

Re: 25 ist kleiner als 25?
 
Hallo r_kerber,

nun ja, wenn in dblWeight 24,99999999 drinsteht, dann wird doch ebendieser Wert zum Vergleich herangezogen und nicht auf 25 aufgerundet, oder?

Anders gesagt, wenn ich mir den Inhalt von dblWeight mit FloatTostr anzeigen lasse und es steht 24,99999 drin, dann werden auch 24,99999 angezeigt. Alles andere würde bedeuten, dass Delphi automatisch aufrundet und das glaube ich nicht.


Grüße

Frank

Luckie 2. Dez 2003 17:18

Re: 25 ist kleiner als 25?
 
Delphi nicht aber was ist mit der CPU?

FBrust 2. Dez 2003 17:25

Re: 25 ist kleiner als 25?
 
Ähhh..dem kann ich jetzt nicht ganz folgen, bitte um Aufklärung...

Gruß
Frank

r_kerber 2. Dez 2003 17:54

Re: 25 ist kleiner als 25?
 
Die CPU rechnet binär. Und bei der Umwandlung von/in's Dezimalformat gibt es Rundungsfehler. Und natürlich rundet Delphi auch und zwar genau dann, wenn die Zahl formatiert angezeigt werden werden soll (z.B. mit 2 Nachkommastellen).

trifid 2. Dez 2003 18:18

Re: 25 ist kleiner als 25?
 
Hallo,

geh einfach davon aus, dass in der Datenbank-Schicht immer was anderes steht
als wie im Register des Prozessors.
Wenn Du nun einen Vergleich abbilden möchtest, dann geht das genauer,
indem Du nach einer Differenz fragst, die einen bestimmten Fehler haben könnte.

Für Dich bedeutet das also, wenn Du einen Fehler von 1/1000 nehmen würdest
Delphi-Quellcode:
   if (Abs (dblWeight - FieldbyName('intFrom5').AsFloat) > 0.001) AND
      (Abs (dblWeight - FieldbyName('intFrom6').AsFloat) > 0.001) then
   begin
      ....

himitsu 2. Dez 2003 18:28

Re: 25 ist kleiner als 25?
 
Schon mal versuch mit den gerundeten Werten zu arbeiten ?

Delphi-Quellcode:
If (Round(dblWeight) >= Round(FieldbyName('intFrom5').AsFloat)) and
  (Round(dblWeight) < Round(FieldbyName('intFrom6').AsFloat)) Then Begin ...
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

trifid 2. Dez 2003 18:41

Re: 25 ist kleiner als 25?
 
Hallo

@himitsu,
von der Delphi-Rundungsfunktion Round() würde ich abraten, da diese Fehler hat.

FBrust 2. Dez 2003 19:08

Re: 25 ist kleiner als 25?
 
Also,

dblWeight kommt aus einer Tabelle. Das zugrundeliegende Feld hat den Typ numeric und in der Quelltabelle steht 25,0 drin, nicht mehr und nicht weniger.

Die Felder intFrom5 und intFrom6 kommen auch aus einer Tabelle, haben ebenfalls den Typ numeric und es stehen einmal 15,0 (intFrom5) und einmal 25,0 (intFrom6) drin.

Also glaube ich nicht, dass Runden hier etwas bringt. Die Frage lautet für mich vielmehr:

Wie kann ich den tatsächlichen Wert des Feldes feststellen, d. h. wenn 24,99999 drinsteht, wie kann ich das feststellen?


Grüße
Frank

dizzy 2. Dez 2003 20:39

Re: 25 ist kleiner als 25?
 
Das Problem hierbei ist die Art und Weise wie float/double-Werte hinterlegt werden. Sie werden nämlich nicht dezimal, so wie du sie siehst intern verarbeitet, sondern in Hexdump-Darstellung (frag mich bitte keiner nach Details ;)). Dabei wird die Zahl entsprechend umgerechnet, und die Ungenauigkeit resultiert aus der mathematischen Inkompatibilität von Hex und Dezimal. (Boaaa, klingt das abgehoben :D)

Von daher bist du bei float's immer mit einem minimalen Informationsverlust unterwegs. Und genau DER ist es, der dir in die Suppe spuckt!
Das Verfahren das trifid gezeigt hat ist für Vergleiche von floats üblich und sinnvoll.


gruss,
dizzy

FBrust 2. Dez 2003 22:25

Re: 25 ist kleiner als 25?
 
Na gut, Leute,

vielen Dank für Eure Antworten.

Ich werd' das Verfahren von trifid ausprobieren und dann berichten...


Grüße
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 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