Seite 1 von 2
Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 04:18
von True29
Hi ,
es geht um folgenden code unten.
er soll 100,00 punkte von Punkte_win zu punkte_show addieren und sie da dann subtrahieren. das ganze abhängig von ftime.
Das klappt auch so weit nur habe ich immer einen Rest ?
Grüße und danke für die Hilfe.
Code: Alles auswählen
Define Punkte_win.f = 10000 ;100 punkte
Define ftime.f,punkte_show.f,dwtime1,dwTime2
OpenWindow(0, 0, 0, 0, 0, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Debug Punkte_win
Repeat
dwtime1 = ElapsedMilliseconds()
Punkte_win - Punkte_win * ftime
punkte_show + Punkte_win * fTime
Debug StrF(punkte_show/100,2)
Debug StrF(punkte_win/100,2)
If Punkte_win <= 0.0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
Break
EndIf
WindowEvent()
Select WindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
dwTime2 = ElapsedMilliseconds()
ftime = (dwtime2 - dwtime1) / 1000.0
ForEver
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 09:40
von CSHW89
Hab zwar nicht ganz verstanden, was du machen willst, aber die beiden Zeilen sollten vielleicht vertauscht werden:
Code: Alles auswählen
Punkte_win - Punkte_win * ftime
punkte_show + Punkte_win * fTime
Du benutzt in der zweiten Zeile den neuen Wert von 'Punkte_win' und nicht den alten.
lg Kevin
Edit: Ach und du verschlingst Events, da du (mindestens) zweimal WindowEvent() aufrufst. Bin mir nicht sicher, wie sich Select mit mehreren Cases verhalten würde, vielleicht dann sogar mehr als zweimal. Außerdem ist ein WindowEvent ohne Delay nicht gut für die CPU. Am besten so abändern:
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 10:49
von STARGÅTE
Jup tauschen.
Denn in der erste Zeile änder sich ja Punkte_win und damit wird bei der zweiten Zeile weniger Addiert, als vorher subtrahiert.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 11:15
von Drago
Abgesehen von dem Vertauschen, bei mir wird Punkte_win zwar null, aber
die Prüfung auf Null wird nicht erkannt.
Und punkte_show wird dann auch nicht mehr hoch gezählt.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 12:10
von NicTheQuick
Das liegt dann an der Fließkommaungenauigkeit. Da kann man auch nichts dran ändern. Deswegen sollte man Fließkommazahlen nie auf einen bestimmten Wert prüfen, sondern immer auf einen Bereich.
Oder wenn man eh nur eine feste Anzahl Nachkommastellen nutzt wie z.B. bei Geld (Euro,Cent), dann sollte man Ganzzahlentypen holen und gleich in Cent rechnen statt in Euro.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 12:16
von True29
hm ok .
@NicTheQuick wie mache ich das dann , da ftime bei bei mir in float is wenn ich in ganzzahlentypen rechnen soll ?
Grüße.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 12:20
von NicTheQuick
Wenn es nicht anders geht, testest du am besten auf 'If Punkte_win <= 0.000001', damit es auch funktioniert, wenn die Punkte zwar aussehen wie 0, aber in Wirklichkeit noch ein klein bisschen höher sind.
Mit 'StrF(Punkte_win, 13)' siehst du vielleicht, woran es hakt.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 12:32
von True29
gibts eine möglichkeit mit runden zu Arbeiten oder ftime in int umzuwandel so das ich mit ganzezahlen arbeiten kann ?
Bis jetzt gibts leider noch keinen Lösungsvorschlag.
das vertauschen hilft leider nichts.
kann ja nich so schwer sein wenn punkte_win 100.00 hat diese zu punkte_show zu transferieren

Grüße.
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 12:53
von CSHW89
Nun ja, selbst im mathematischen Sinn kann 'Punkte_win' nie 0 werden, da der Wert, den du subtrahierst immer kleiner ist als 'Punkte_win' selbst. 'ftime' ist ja im Normalfall immer kleiner 1. Also selbst, wenn Fließkommazahlen bis ins unendliche genau wäre, würde es so nicht funktionieren. Ist ein abnehmender Transfer überhaupt gewollt? Wenn nicht, warum nicht einfach so:
Code: Alles auswählen
punkte_show + #TransferProSekunde * fTime
Punkte_win - #TransferProSekunde * ftime
Debug StrF(punkte_show/100,2)
Debug StrF(punkte_win/100,2)
If Punkte_win <= 0.0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
Punkte_show = 10000
Punkte_win = 0
Break
EndIf
... wobei die Konstante #TransferProSekunde noch gesetzt werden muss (z.B. 10000, dann würde der Transfer 1 Sekunde benötigen).
lg Kevin
Edit: Millisekunde -> Sekunde
Re: Algorithmus zur addierung von Punkten verrechnet sich ?
Verfasst: 04.10.2013 13:11
von NicTheQuick
Ich wollte gerade das selbe schreiben wie CSHW89. Hier ein vollständiger Code:
Code: Alles auswählen
EnableExplicit
Define Punkte_win.i = 10000 ;100 punkte
Define ftime.i,punkte_show.i,dwtime, diff.i
#TransfersProSekunde = 100
OpenWindow(0, 0, 0, 0, 0, "test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Debug Punkte_win
dwtime = ElapsedMilliseconds()
Repeat
diff = #TransfersProSekunde * ftime / 1000
Punkte_win - diff
punkte_show + diff
Debug StrF(punkte_show/100,2)
Debug StrF(punkte_win/100,2)
If Punkte_win <= 0 ;//ende bei 0 dann sollten beide weete win und show auf 0 sein.
Break
EndIf
Select WaitWindowEvent(10)
Case #PB_Event_CloseWindow
End
Case 0
ftime = ElapsedMilliseconds() - dwtime
dwtime + ftime
EndSelect
ForEver