Casten -> Runden ungenau?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

PSY

Betreff: Casten -> Runden ungenau?

BeitragSo, Feb 10, 2013 3:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

steh grad etwas aufm Schlauch Smile

Code: [AUSKLAPPEN]
For i=1 To 10
   Print Int(i* 1.5)
Next
WaitKey


Warum wird zB bei 1*1.5 auf 2 aufgerundet, aber bei 3*1.5 auf 4 abgerundet?

PSY
PSY LABS Games
Coders don't die, they just gosub without return

SpionAtom

BeitragSo, Feb 10, 2013 3:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ehrlich gesagt keine Ahnung, aber wenn du ab x.5 immer aufrunden willst, dann kannst du es so machen:

Code: [AUSKLAPPEN]
For i#=1 To 10
   Print i * 1.5 + ", " + Int(i* 1.5) + ", " + Floor((i * 1.5) + 0.5)
Next
WaitKey
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

DAK

BeitragSo, Feb 10, 2013 9:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem liegt wohl darin, wie Floats aufgebaut sind. So wie sie sind kannst du mit ihnen kaum genaue Zahlen definieren (darum heißen Integer auch so, weil das heißt, dass sie genaue Werte annehmen).

Stell dir Floats vor als Gleitkommazahl nach diesem Schema:
1.4352876 * 10^15
Oder:
Mantisse * 10^Exponent

Der Exponent selbst ist eine Ganzzahl, also genau. Die Mantisse aber hat eine fixe Länge (so z.B. 16 bit) und somit auch im Dezimalzahlenraum eine bestimmte Nachkommalänge, also z.B. (keine echten Zahlen, nur mal so Hausnummer) 1.23456. Da sie aber in Binär und nicht in Dezimal gezählt wird, geht die Zahl nicht in 0.00001er-Schritten hoch, sondern z.B. in 0.00012ern hoch. Dadurch kriegst du nie echt genaue Werte zusammen und somit auch so lustige Effekte wie den Deinen.

Im Grunde: Willst du wirklich genaue Werte, dann nimm Integer-Werte, die vor der Anzeige passend zurechtgeschoben werden. Im Bankenwesen zählt man gerne Integerwerte in Cents und zerlegt die vor der Ausgabe in Euro und Cents. In z.B. WoW wird das Geld auch nicht in einem Gold-Float sondern in einem Kupfer-Int gezählt. Selbst Doubles wären nicht genau genug für den Job.

Hoffe, das hilft.
Gewinner der 6. und der 68. BlitzCodeCompo

PSY

BeitragSo, Feb 10, 2013 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke fuer die Aufklaerung, Leute.
Ich wusste, dass sie ungenau sind, hab bloss nicht damit gerechnet, dass das schon in einer Groessenordnung wie o.g. zu Buche schlaegt.

Ist aber verstaendlich.

Zahlen, die im Dezimalsystem rund aussehn, koennen binaer nicht exakt dargestellt werden, da sie dort unendlich viele Nachkommastellen besitzen. Sie werden dort also gerundet. Bei der Rueckumwandllung ins Dezimalsystem entstehen dann die Rundungsfehler. (Artefaktbildung).

PSY
PSY LABS Games
Coders don't die, they just gosub without return

aMul

Sieger des Minimalist Compo 01/13

BeitragSo, Feb 10, 2013 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Mehr Hintergrund-Info für technisch interessierte:
http://en.wikipedia.org/wiki/R...lf_to_even
Panic Pong - ultimate action mashup of Pong and Breakout <= aktives Spiele-Projekt, Downloads mit vielen bunten Farben!
advASCIIdraw - the advanced ASCII art program <= aktives nicht-Spiele-Projekt, must-have für ASCII/roguelike/dungeon-crawler fans!
Alter BB-Kram: ThroughTheAsteroidBelt - mit Quelltext! | RGB-Palette in 32²-Textur / Farbige Beleuchtung mit Dot3 | Stereoskopie in Blitz3D | Teleport-Animation Screensaver

DAK

BeitragSo, Feb 10, 2013 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Grund, warum sich das hier zu Buche schlägt, ist hald, weil du beim Runden auf genaue Werte überprüfst. Rundet man wie normal bei 0.5 auf und sonst ab, hast du quasi das hier:

Code: [AUSKLAPPEN]

if (x<0.5) then
 aufrunden
else if (x>=0.5) then
 abrunden
endif


Somit fällt hier auch ein 0.00001 weniger oder als 0.5 vollkommen ins Gewicht und kann das Züngelchen sein, dass die Waage zum kippen bringt.

Edit: Danke, Amul, das hat natürlich dann auch was damit zutun. Hab aber nicht gewusst, dass Blitz Round to Even verwendet. Ich hab gedacht, die verwenden dort nur Round half away from Zero, so wie man es in der Schulmathematik machen würde.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group