Stetige Substraktion von Floats macht Probleme

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

creat1ve

Betreff: Stetige Substraktion von Floats macht Probleme

BeitragDi, Aug 03, 2004 11:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin neu hier, also erstmal: Hi! Very Happy

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. Sad

Durch den Fehler muss ich an den unnötigsten Stellen runden und die Fahrphysik wird dadurch hakelig Sad

Ich hoffe es kann mir einer helfen!

Jan_

Ehemaliger Admin

BeitragDi, Aug 03, 2004 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
between angels and insects
 

creat1ve

BeitragDi, Aug 03, 2004 11:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht leider nicht so einfach Sad

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 Sad

Jan_

Ehemaliger Admin

BeitragDi, Aug 03, 2004 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2004 11:56
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
 

Edlothiol

BeitragDi, Aug 03, 2004 12:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2004 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad

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 Smile

Jan_

Ehemaliger Admin

BeitragDi, Aug 03, 2004 12:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Aug 03, 2004 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

Jan_

Ehemaliger Admin

BeitragDi, Aug 03, 2004 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
gut, dann warten wir auf den Code.
between angels and insects
 

creat1ve

BeitragDi, Aug 03, 2004 12:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile

//EDIT: Wird ,,OpenSource" btw. 8)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group