Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   vergleich von Werten (https://www.delphipraxis.net/103785-vergleich-von-werten.html)

Weazy 21. Nov 2007 20:29


vergleich von Werten
 
Für die Uni müssen wir folgendes Problem lösen:

Beim Vergleich zweier Float Werte kann es zu Fehlern kommen, wenn sich die beiden Werte erst nach einer bestimmten Nachkommastelle unterscheiden, welche von Float nicht mehr gespeichert werden. Wie könnte man die Werte vergleichen, ohne das diese Problematik auftritt?

Danke!

Dax 21. Nov 2007 20:32

Re: vergleich von Werten
 
Den minimalen Unterschied, der noch als Unterschied gilt (sagen wir 0.001, alle Differenzen darunter gelten als gleich) nennen wir mal Epsilon. Wenn nun |float1 - float2| <= Epsilon ist, sind beide im Rahmen der Epsilon-Genauigkeit gleich.

Weazy 21. Nov 2007 20:33

Re: vergleich von Werten
 
wie währe es denn mit runden?

sirius 21. Nov 2007 20:33

Re: vergleich von Werten
 
Du meinst, du hast zwei Float-Zahlen, z.B.:
1,000000005 und
1,000000006
Und wenn man jetzt Single nehmen würde (man kann das Beispiel auch für Extended umbauen),
dann sind die Zaheln gleich, da Single die 5 und 6 nicht mehr speichern kann.

hmmm?
Die Zahlen eben als Brüche speichern?

Weazy 21. Nov 2007 20:46

Re: vergleich von Werten
 
die Lösung muss etwas mit dem Thema diskretisierung zu tun haben...

quendolineDD 21. Nov 2007 20:51

Re: vergleich von Werten
 
Die Zahlen durch bestimmte Zerlegung "kürzen". Alle vorkommastellen kann man zum Beispiel seperat speichern. Die verbleibenden Stellen kann man nun durch bestimmte Algorithmen kürzen. Wenn zum Beispiel etliche 0en (nullen) enthalten sind, kann man diese durch ein auslagern als Exponenten auch entnehmen.
So wäre zum Beispiel die Zahl 6.0000000000000005800000001 folgend zu speichern:
Vorkommawert: 6
Nachkommawerte:
15x0 + 58 + 7x0 + 1

War es nciht extended mit 16 signifikanten Nachkommastellen?

Lt. dem Problem des TE würde an dieser Stelle sich der Wert der Zahlen wohl erst ab der 17. Stelle nach dem Komma unterscheiden.

Doch da hier schon erste Ungenauigkeiten durch die Rundung der Zahl entstehen wäre es vielleicht auch sinnvoll, die Rechnung aus der die Zahl entsteht zu belassen.

Schaue man bei Wikipedia zum Thema: http://de.wikipedia.org/wiki/Diskretisierung

Dann wäre mein Vorschlag wohl schon dementiert :)

3_of_8 21. Nov 2007 21:19

Re: vergleich von Werten
 
Es gibt dafür irgendne Delphi-Funktion... IsEqual, FloatEqual, FloatIsEqual oder irgendsowas in der Art. Auf jeden Fall verwendet die auch die Epsilon-Methode, und so sollte man es wohl auch machen.

sirius 21. Nov 2007 21:22

Re: vergleich von Werten
 
Zitat:

Zitat von 3_of_8
Es gibt dafür irgendne Delphi-Funktion... IsEqual, FloatEqual, FloatIsEqual oder irgendsowas in der Art. Auf jeden Fall verwendet die auch die Epsilon-Methode, und so sollte man es wohl auch machen.

Die Funktion heist samevalue. Aber die macht ja genau das verkehrte. Sie behauptet ja die Werte sind (annähernd) gleich, obwohl sie nicht gleich sind.

3_of_8 21. Nov 2007 21:40

Re: vergleich von Werten
 
Aaah, ich hab die Frage falsch verstanden. In dem Fall könnte man eventuell einen von Hagens DECMath-Typen verwenden. Die sind - IIRC - beliebig genau.

grenzgaenger 21. Nov 2007 23:49

Re: vergleich von Werten
 
Zitat:

Zitat von Weazy
wie währe es denn mit runden?

beim runden kann es in die gegensätzlichen richtungen runden... damit sind die zahlen ungleich, obwohl sie gleich sind...

die standardmethode, ist die von DAX. diese solltest du auch verwenden... (ist im übrigen unabhängig von der programmiersprache ;-) )


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:40 Uhr.
Seite 1 von 2  1 2      

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