Rechenfehler ???



  • Hi Leutz,

    ich hab mal ne interessante Frage. Ich habe eine Variable vom Typ float welche ich mit 0.0f initialisiert habe. In einer Schleife ziehe ich von dieser Variablen -0.1f ab bis ich den Wert -56.0f erreicht habe. Das interessante daran ist das er während dieser Rechenoperationen irgendwann nicht -0.1f rechnet sondern -0.09 rechnet so das der Wert von -56.0f knapp mit 55.997f (ich hab die schleife debugged) verfehlt wird(und so mit meine Schleife weiterläuft). Wie bekomme ich diesen Rundungsfehler raus ?
    Hat das schon mal jemand gehabt ?



  • Die Rundungsfehler sind normal, deshalb kannst du floats auch nicht mit == vergleichen.
    Nehm doch ints und rechne solange +1 bis du 560 erreicht hast, das ist genau dasselbe dann nur ohne Rundungsfehler und auch schneller.

    [ Dieser Beitrag wurde am 21.05.2003 um 15:42 Uhr von dreaddy editiert. ]



  • Hi,

    das hat mit der Darstellung der float Zahlen zu tun. Der Rechner hat ja nur eine bestimmte Anzahl an bits zur Verfügung. Und alles was kleiner ist als 1 muss er approximieren. Okee nicht alles: 0.5, 0.25, 0.125 usw kann er exakt darstellen aber die Zahl 0.1 kann er schon nicht mehr 100% genau (mit der Genauigkeit von float) darstellen.

    Schau Dir mal an wie Zahlen kleiner Null binär im Rechner vorliegen. Da kann es leicht zu solchen Effekten kommen ...

    Legolas



  • @All:
    Danke ich werde es mal mit Int und einem Cast versuchen da die Funktion die den Wert bekommt dummerweise einen float braucht und ich sie nicht ändern kann (fremde API *grrr*).
    Trotzdem danke.



  • Oder aber... wenn Du weißt, daß die Werte einen bestimmten Schwellwert nicht überschreiten bzw. unterschreiten (maximale maschinelle Darstellung von Zahlen auf dem Rechner beachten), multipliziere deine Ergebnisse mit z.B. 100.000 damit wird der maschinelle Rundungsfehler ausgetrickst. Im Anschluß dividierst Du wieder mit 100.000 und Du hast Deinen gewünschten Wert.

    Gruß Winn

    EDIT: Selbst addieren bzw. im Anschluß subtrahieren würde gehen... Hauptsache ganzzahlig, weil sie in der Regel vom Rechenwerk besser verarbeitet können, als Gleitkomma Arithmetik, wie Du siehst 🙂

    [ Dieser Beitrag wurde am 21.05.2003 um 18:48 Uhr von Winn editiert. ]


Anmelden zum Antworten