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
Problem mit Ungenauigkeit od Rundungsfehler bei float Werten
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:
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.
@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.