Anfängerfrage: Kommastellen reduzieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Selda
User
Beiträge: 4
Registriert: Mittwoch 25. August 2010, 08:16

Hallöchen,

ich möchte zwei float - Zahlen auslesen und sehen, ob sie identisch sind.

Das Problem dabei ist, dass sie eine unterschiedliche Anzahl an Kommastellen haben.

Wie kann ich die Anzahl an Stellen z.b. auf 4 reduzieren? Integer oder runden würde mir nichts nützen, ich muss die Zahl hinten einfach abschneiden können. Geht das irgendwie?
In Text umwandeln vorher wäre auch ok.

Danke für jede Hilfe,
Selda
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Das ist doch komisch. Identische Zahlen haben doch die gleiche Anzahl an Nachkommastellen (unter anderem), die Nullen am Ende kannst du dir ja wegdenken. Und wenn es keine Nullen sind, die am Ende die Gleichheit stören, dann sind die Zahlen nicht identisch.

Code: Alles auswählen

>>> 1.00
1.0
>>> 1.000
1.0
>>> 1.0000 == 1.0000000000000
True
>>> 
Zuletzt geändert von nomnom am Freitag 3. Dezember 2010, 16:19, insgesamt 1-mal geändert.
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Sobald du aber rechnest, hast du Probleme mit Floats.

Floats vergleicht man normalerweise über ein Epsilon.

Schau mal hier:
http://pyfaq.infogami.com/why-are-float ... inaccurate
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Das macht man i.d.R. über einen Treshold/Schwellwert:

Code: Alles auswählen

In [8]: a = 0.00001

In [9]: b = 0.00002

In [10]: threshold = 10**-4

In [11]: abs(a-b) < threshold
Out[11]: True
Edit: Das ist das selbe wie mit dem Epsilon, aber durch `abs` etwas eleganter.
Zuletzt geändert von ms4py am Freitag 3. Dezember 2010, 16:23, insgesamt 1-mal geändert.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Ja, stimmt. Floats sind total ungenau.

Code: Alles auswählen

>>> 1 - 0.9
0.099999999999999978
>>> 
Schau dir mal das decimal-Modul an. :)

Code: Alles auswählen

>>> decimal.Decimal('1') - decimal.Decimal('0.9')
Decimal('0.1')
>>> 
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

@ms4py: Ich hatte ja auch keine Implementation angegeben :)
Aber in der Mathematik nennt man es einfach Epsilon, wenn du numerische Näherungsverfahren einsetzt.

Hier noch ein guter Artikel zu dem Thema:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

//edit oder doch, habs nur überflogen :D
Selda
User
Beiträge: 4
Registriert: Mittwoch 25. August 2010, 08:16

Wow, ihr seid ja schnell :)

Danke, mehrere Vorschläge, die ich gleich mal ausprobieren werde.

Ja, mein Problem ist, dass ich die Zahlen aus Geometrie-Objekten aus ArcGIS auslese, und komischerweise haben die eine unterschiedliche Anzahl an Stellen, je nachdem ob es Koordinaten von einem Punkt oder von den Endpunkten einer Linie sind. Keine Ahnung warum, aber ich muss halt wissen, ob der Punkt mit dem Endpunkt der Linie übereinstimmt auf eine gewisse Genauigkeit.

Danke für die schnellen Antworten!

Selda
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Selda hat geschrieben:ich möchte zwei float - Zahlen auslesen und sehen, ob sie identisch sind.
Kleine Korrektur: Du meinst Gleichheit, nicht Identität.
Selda hat geschrieben:Wie kann ich die Anzahl an Stellen z.b. auf 4 reduzieren?
Was du wirklich suchst ist ein Treshold, wie von ms4py vorgeschlagen.

Nur der Vollstaendigkeit halber - bitte nicht nutzen:
Stichwort: Stringformatting.
`"%.4f"` fuer Floats mit 4 Nachkommastellen.
Selda
User
Beiträge: 4
Registriert: Mittwoch 25. August 2010, 08:16

Ja, da haste wohl recht mit der Gleichheit.

Ich dachte "identisch", weil ich an dem Punkt die Linie zerschnitten habe, insofern müsste der Punkt und der Anfangspunkt der Linie eigentlich identisch sein, aber komischerweise wird wie gesagt eine unterschiedliche Anzahl von Kommastellen ausgelesen. Aber das ist wohl ein ArcGIS-spezifisches Problem.

Danke allen!
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Aber das ist wohl ein ArcGIS-spezifisches Problem.
Ich denke eher, dass das in der Natur von Floats liegt.

Der Artikel, den ich im zweiten Post verlinkt habe, gibt dir sehr gute Einblicke in dieses Thema, auch wenn er zugegebenermassen sehr lang ist :)
Antworten