Stetige Substraktion von Floats macht Probleme
Übersicht

creat1veBetreff: Stetige Substraktion von Floats macht Probleme |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bin neu hier, also erstmal: Hi! ![]() Habe ein großes Problem... Ich programmiere im Moment ein 4 Spieler - Spiel (Rundenbasiert) mit GTA elementen. (Man kann schon in Autos einsteigen, austeigen, Minimap, verschiedene Autos mit verschiedenen Geschwindigkeiten etc.) Jetzt mein Problem: Für die Berechnung der Auto - Physik muss ich des Öfteren einen Float um 0.05 vergrößern und verkleinern... Das vergrößern ist kein Problem, aber wenn ich jetzt von dem Float öfters wieder was abziehe, kommen gegen 0 seltsame Nachkommazahlen und sogar HEXWerte raus... Also z.B Code: [AUSKLAPPEN] for i=1 to 1000
i = i + 0.05 Print i Next WaitKey for i=1 to 1000 i= i - 0.05 Print i Next WaitForKey (Bei der letzten Schleife sollte das Ganze, logischer weise einfach wieder auf 0 zurückgehen, aber das tut es nicht... Stattdessen kommt eine HEXZahl raus, oder -3,0923910230 etc. ![]() Durch den Fehler muss ich an den unnötigsten Stellen runden und die Fahrphysik wird dadurch hakelig ![]() Ich hoffe es kann mir einer helfen! |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, dann lase doch einfach diese Zahlen!
Was Stören sie dich? Wenn du sie anzeigen willst, mache das so: Code: [AUSKLAPPEN] Text X,Y,Int(Float_Wert#)
Wenn du Auf einen bestimmten wert runden willst: Code: [AUSKLAPPEN] function Runde(In#,NachkommaStellen%)
Local ,save%out% save% = int(In#*(10^NachkommaStellen%)) Out# = float(save)/float(10^NachkommaStellen%) return out% end function -nicht getestet aber Lizensfrei ![]() |
||
between angels and insects |
creat1ve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das geht leider nicht so einfach ![]() Ich multipliziere oft mit diesen Float (Lenkrad addition / Sin und Cos) Wenn ich ihn dann am Ende runde kommen ungenaue Zahlen raus -> das auto fährt z.B um einen Pixel rückwärts wenn die Geschw. wieder auf 0 runtergesetzt wird ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
pass mal auf, ich verstehe dein problem nicht.
Wenn das Bremsen nicht funktioniert, dann mache nicht Code: [AUSKLAPPEN] speed# = speed# -0.5
sonder Code: [AUSKLAPPEN] speed = speed# * 0.9
|
||
between angels and insects |
creat1ve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jan_ hat Folgendes geschrieben: pass mal auf, ich verstehe dein problem nicht.
Wenn das Bremsen nicht funktioniert, dann mache nicht Code: [AUSKLAPPEN] speed# = speed# -0.5
sonder Code: [AUSKLAPPEN] speed = speed# * 0.9 Werde ich probieren, Danke ![]() |
||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das liegt daran, dass Floats nicht sonderlich genau sind. Und wenn du da dauernd 0.05 addierst, hast du jedes Mal einen kleinen Fehler, der zwar nur sehr gering ist, aber immer weiter aufsummiert wird.
Mit "Hex - Zahlen" meinst du denke ich mal sowas hier:Code: [AUSKLAPPEN] 8.10732e-008
Oder? Das sind allerdings keine Hex - Zahlen, sondern Exponentialzahlen (oder so ähnlich). Ausserdem ist Hexadezimal auch nur eine Darstellungsweise, am Wert ändert sich da nichts.
|
||
creat1ve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Edlothiol hat Folgendes geschrieben: Das liegt daran, dass Floats nicht sonderlich genau sind. Und wenn du da dauernd 0.05 addierst, hast du jedes Mal einen kleinen Fehler, der zwar nur sehr gering ist, aber immer weiter aufsummiert wird.
Mit "Hex - Zahlen" meinst du denke ich mal sowas hier:Code: [AUSKLAPPEN] 8.10732e-008
Oder? Das sind allerdings keine Hex - Zahlen, sondern Exponentialzahlen (oder so ähnlich). Ausserdem ist Hexadezimal auch nur eine Darstellungsweise, am Wert ändert sich da nichts.Aber wieso ist das nur bei der Addition so? Ich meine, wenn ich es 1000x addiere, ist die Zahl genau... Subtrahiere ich 0.05 1000x, ist es nicht so ![]() Ist das ein Bug, der in irgendeiner neuen Version gefixt wurde? Oder kann man diesen Fehler irgendwie übergehen? Ist im Moment echt nervig... Danke schonmal an euch da oben, für all die Hilfe ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
pass auf!
Code: [AUSKLAPPEN] if keydown(200) then speed# = speed# + 0.5
if keydown(208) then speed# = speed# - 0.5 if Speed > Maxspeed then speed = Maxspeed if speed < 0 then speed = 0 Speed#=speed#*0.95 |
||
between angels and insects |
- Zuletzt bearbeitet von Jan_ am Di, Aug 03, 2004 12:24, insgesamt einmal bearbeitet
creat1ve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jan_ hat Folgendes geschrieben: pass auf!
Code: [AUSKLAPPEN] if keydown(200) then speed# = speed# + 0.5
if keydown(200) then speed# = speed# - 0.5 if Speed > Maxspeed then speed = Maxspeed if speed < 0 then speed = 0 Speed#=speed#*0.95 Ich würde gerne meinen Code posten, aber den habe ich leider auf meinem Laptop. Das Problem ist hier, dass es auchnoch einen Rückwärtsgang gibt, sprich: Die Beschleunigung kann auch ins Negative rutschen. Trotzdem Danke ![]() |
||
![]() |
Jan_Ehemaliger Admin |
![]() Antworten mit Zitat ![]() |
---|---|---|
gut, dann warten wir auf den Code. | ||
between angels and insects |
creat1ve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Habs wieder mit ner Int-Rundung gelöst. Hab bisschen den Code optimiert und jetzt stockts auch nichtmehr.
Ich kann ja irgendwann, wenn ich die Physik-Demo fertig hab, mal Code und das Projekt posten, wenn ihr wollt ![]() //EDIT: Wird ,,OpenSource" btw. 8) |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group