Problem mit Ungenauigkeit od Rundungsfehler bei float Werten

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
Copppi
User
Beiträge: 1
Registriert: Donnerstag 6. Januar 2011, 15:24

Hallo,

ich muss einen Simulator erstellen der einen Netzwerklink simuliert, d.h. er führt Protokoll über Ankunft und Ende von TCP Flows. Leider habe ich Probleme mit der Genauigkeit von float Werten, die bspw. das Ende eines TCP Flows berechnen sollen. Das führt dazu das ist statt des richtigen Wertes 0 einen Wert wie -2.6454533008646308e-17 habe (oder auch größer und das führt zu Fehlern).
Das kommt wahrscheinlich daher, dass die Werte unterschiedliche Genauigkeiten haben.
Ein Bsp: Ich berechne den nächsten zeitpunkt an den ein Flow endet: nextdep = simtime + activeflows[0][0] (Liste meiner aktiven TCP Flüsse). Statt 0 kommt etwas wie 2.6454533008646308e-17 raus.
Der Wert nextdep wird ungenau berechnet, da der Wert aus activeflows[0][0] komischerweise auf eine gewisse Anzahl Stellen (immer unterschiedlich) gerundet ist. Das Problem könnte darin liegen, dass m.M. immer auf eine unterschiedliche Zahl von Stellen gerundet wird. Würde immer auf bspw. 10 Stellen gerundet werden, dann gibt es vielleicht diese Probleme nicht.

Ich weiß nicht, wie ich dieses Problem lösen kann und bin ganz verzweifelt.

Danke
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Diese Ungenauigkeit ist normal und lässt sich nicht vermeiden. Der übliche Weg um floats zu vergleichen ist die Zulassung einer gewissen (kleinen) Abweichung epsilon. In deinem Fall also:

Code: Alles auswählen

abs(f) < epsilon
Das Leben ist wie ein Tennisball.
Benutzeravatar
Jerry
User
Beiträge: 13
Registriert: Freitag 29. Oktober 2010, 15:00

Man könnte aber auch Pythons decimal modul benutzen
Nur weil ich paranoid bin, heisst das noch lange nicht, dass ich nicht verfolgt werde!
BlackJack

@Jerry: Das wird wahrscheinlich nichts nützen oder das Problem nur verschleiern bis es doch irgend wann wieder auftaucht. Auch das `decimal`-Modul kann nicht alle Rechnungen verlustfrei durchführen. Das hat auch endliche Genauigkeit und es gibt nun einmal Dezimalbrüche mit unendlich vielen Nachkommastellen.
Antworten