C++ Rechenfehler beheben

Chrisel

Cadet 4th Year
Registriert
Sep. 2010
Beiträge
70
Hallo Alle zusammen:)
bin gerade mit einem kumpel dabei ein kleines Spiel zu schreiben. Nichts schwieriges sondern nur ein 2D spiel mit opengl. Per Tastendruck veränder ich die X und Y koordinaten der Spielfigur(beide float). Bei einem Schritt verändert sich die jeweilige Variable um 0.025f .
Nun hatte ich einige kleine fehler in meinem Programm und hab mir deshalb die koordinaten dazu als zahlen anzeigen lassen. Dabei ist mir Folgendes aufgefallen:
Am Anfang stimmen die X und Y werte. Jedoch nach ca Schritt 150 sehen die werte folgendermaßen aus:
x= 3,65/3,675/3,70001/3,72501/3,75001/....(Schritte nach Rechts-> X+=0.025f)
Irgendwie Merkwürdig.
Kann mir jemand erklären warum diese Fehler zustandekommen und wie man verhindern kann das aufeinmal statt 0.025f 0.02501 dazuaddiert wird?:) Danke für Antworten schonmal im vorraus:)

Viele Grüße
Chrisel
 
Wie in allen Programmiersprachen auch.

X = INT (Wert * 10.000 +0,5)/ 10.000

Den Faktor 10.000 must Du an deinen Wertebereich anpassen.

Viel Erfolg mit deinem Projekt.
 
Oh:D man da hätte ich aber auch mal selber drauf kommen können:D
Danke für eure antworten:) ich denke ich krieg das Problem jetzt in den griff nachdem ich weiß um was es sich handelt:)
Danke!

Viele Grüße
Chrisel
 
Wenn du die Rundungsfehler gering halten willst, dann solltest du nicht über sukzessive Addition arbeiten, weil sich so die Rundungsfehler auch addieren. Wenn du das vermeiden willst kannst du auch X = a+b*Y verwenden und b als integer auf- und abzählen lassen. Y ist die schrittgröße, a der startwert.
 
Für solche Berechnungen in Spielen werden meistens Ganzzahlten genommen, um eben diese Ungenauigkeit zu verhindern.

Willst du dennoch floats verwenden, bietet die Standardbibliothek etwas an:
numeric_limits<float>::epsilon()
Anstatt dann zwei floats mit == zu testen, vergleichst du sie folgendermaßen:
if (abs(float1 - float2) <= numeric_limits<float>::epsilon())
 
In Spielen eher weniger. Bei Simulationen und Steuergeräten kommt das zum Einsatz. Bei nem Spiel ist es meist völlig egal ob bei der 10. Stelle hinterm Komma ein Rundungsfehler auftritt.
 
Kommt drauf an, wie man die Werte nutzt.
Ist es z.B. ein Retro-2D-RPG kann man toll 1 Pixel = 1 Koordinate nehmen und sich damit das Epsilon-Gefrickel sparen.
 
Zurück
Oben