Delphi-PRAXiS

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 ;-) )

Dani 22. Nov 2007 02:15

Re: vergleich von Werten
 
Zitat:

Zitat von Weazy
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?

Die Aufgabe ist sch*** gestellt, ich würde da nämlich reininterpretieren, dass man die Datenstruktur der Fließkommazahlen beibehalten soll.

LoCrux 22. Nov 2007 03:52

Re: vergleich von Werten
 
Also da muss ich Dani zustimmen,

1. Auf dem Papier kann ich Die Zahlen immer vergleichen, mathematisch ist hier die Genze "mein koennen".

2. Der Vergleich mit dem Rechner (als Fliesskommazahl) geht nicht, da die Formulierung schon den Fehler impliziert. Sprich ich werde es nicht feststellen koennen, wann zwei zu vergleichende Zahlen zu der Menge "Nicht Arithmetisch Vergleichbar" gehoeren!!!!

3.
Zitat:

..von Float nicht mehr gespeichert werden..
Insgesamt sehr unglueckliche Formulierung fuer einen Prof./Doz..
Da sie nicht gespeichert werden koennen, sind sie entweder NAN oder identisch.

4. Eine Loesung waehre die "Zahl" selbst als String oder als Reihe (q-adischen Darstellung) abzulegen und dann indexweise vergleichen.

LoCrux 22. Nov 2007 05:46

Re: vergleich von Werten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hab das hier noch gefunden.

Weazy 22. Nov 2007 12:22

Re: vergleich von Werten
 
ich habe jetzt einfach geschrieben das wenn Werte als Float gespeichert sind man diese nur auf eine bestimmte genauigkeit verleichen kann und habe einen pseudo code geschrieben der einfach jede stelle der Werte miteinander vergleicht.

PS: der Prof geht nächstes Jahr eh in Rente... :-D


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