Algorithmus zur addierung von Punkten verrechnet sich ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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:

Code: Alles auswählen

  ...
  event = WaitWindowEvent(10)
  Select event
  ...
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Drago
Beiträge: 148
Registriert: 02.02.2010 18:22
Computerausstattung: Win XP SP3, AMD Sempron (MMX) 1.2 GHz, 512 MB, Nvidia GeForce FX 5200, 128 MB, DirectX 9.0c
Wohnort: Westerwald

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Algorithmus zur addierung von Punkten verrechnet sich ?

Beitrag 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
Antworten