Seite 1 von 1

Problem mit Ungenauigkeit od Rundungsfehler bei float Werten

Verfasst: Donnerstag 6. Januar 2011, 15:45
von Copppi
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

Re: Problem mit Ungenauigkeit od Rundungsfehler bei float We

Verfasst: Donnerstag 6. Januar 2011, 16:12
von EyDu
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

Re: Problem mit Ungenauigkeit od Rundungsfehler bei float We

Verfasst: Donnerstag 6. Januar 2011, 22:10
von Jerry
Man könnte aber auch Pythons decimal modul benutzen

Re: Problem mit Ungenauigkeit od Rundungsfehler bei float We

Verfasst: Donnerstag 6. Januar 2011, 22:58
von 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.