Float um 0.01 ungenau
-
Hallo zusammen,
bin gerade dabei eine Pokersoftware zu entwickeln. Bin schon recht weit gekommen, bloß gibt es ein Problem mit den Floatvariablen. Wenn eine Variable den Wert 0.01 enthält und ich diese Variable zum Rechnen verwenden kommen oft ungenaue Werte(um 0.01) raus.
Ein beispiel:
float var1=0.01; float var2=0.50; var1*=100: var2*=100; float sum=var1+var2; std::cout<<sum;Bei der Ausgabe kommt manchmal als Ergebnis 51 und manchmal 50 raus.
Ich kann mir das gar nicht erklären.
Brauche eure HilfeDanke schonmal für jede Antwort

Gruß Gemeddy
-
http://en.wikipedia.org/wiki/Floating_point#Minimizing_the_effect_of_accuracy_problems
Bedenke auch: Fließkommazahlen nutzt man wenn man eine theoretisch unendliche Genauigkeit haben möchte. Wenn du aber mit Zahlen arbeitest die immer n Stellen hinter dem Komma haben (z.B. mit Geld), mach dir lieber einen Wrapper um Ganzzahltypen. (Diese sind absolut präzise.)
-
wow, danke für die schnelle Antwort

Ich lese gerade den Text auf Wikipedia. Brauche ein wenig länger um den Text zu verstehen, da Englisch nicht so meine Sprache ist.
Wenn möglich möchte ich schon bei dem Datentyp Float bleiben. Ansonsten müsste ich im Quellcode sehr viel abändern.
-
cooky451 schrieb:
Bedenke auch: Fließkommazahlen nutzt man wenn man eine theoretisch unendliche Genauigkeit haben möchte. Wenn du aber mit Zahlen arbeitest die immer n Stellen hinter dem Komma haben (z.B. mit Geld), mach dir lieber einen Wrapper um Ganzzahltypen. (Diese sind absolut präzise.)
Oder in Basiseinheiten (hier Cent) Rechen (obwohl bei den komplexeren Sachen wie Weg-Einheiten wohl ein Wrapper angebracht wäre).
@TE: Englisch ist bei Informatik sehr wichtig. Nicht nur wegen der internationalisierung, auch, weil sogut wie alle (guten) Texte in Englisch sind.
-
Was genau berechnest du denn da? Mit einer ordentlichen Kapselung sollte das eigentlich nicht viel mehr als ein strg+h werden.
-
Mit den Floatvariablen berechne ich alles was mit den Spielchips zu tun hat, z.B. wieviel Cent zu callen sind. Ich habe eben rausgefunden, dass der Wert, wenn ich den vor der Weiterverarbeitung der Variable ausgebe, stimmt.
Beispiel:float var1=0.01; float var2=0.50; var1*=100: std::cout<<var1; var2*=100; std::cout<<var2; float sum=var1+var2; std::cout<<sum;
-
Gemeddy schrieb:
alles was mit den Spielchips zu tun hat, z.B. wieviel Cent zu callen sind.
Vergiss float. Egal wie viel Arbeit die Umstellung macht, das Gegenteil macht mehr Arbeit.
Überleg dir ein sauberes Design für eine Geld oder sogar Chip-Klasse, mit der du rechnen kannst. Alles Andere ist hier definitiv nicht Zielführend.
-
alright - let's do it
Danke für eure Hilfe
-
Hacker schrieb:
cooky451 schrieb:
Bedenke auch: Fließkommazahlen nutzt man wenn man eine theoretisch unendliche Genauigkeit haben möchte. Wenn du aber mit Zahlen arbeitest die immer n Stellen hinter dem Komma haben (z.B. mit Geld), mach dir lieber einen Wrapper um Ganzzahltypen. (Diese sind absolut präzise.)
Oder in Basiseinheiten (hier Cent) Rechen (obwohl bei den komplexeren Sachen wie Weg-Einheiten wohl ein Wrapper angebracht wäre).
@TE: Englisch ist bei Informatik sehr wichtig. Nicht nur wegen der internationalisierung, auch, weil sogut wie alle (guten) Texte in Englisch sind.
Hör doch mal auf alles nachzuplappern. Was bitte weißt Du schon von Informatik und Banksoftware?
