Casten -> Runden ungenau?
Übersicht

![]() |
PSYBetreff: Casten -> Runden ungenau? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hoi,
steh grad etwas aufm Schlauch ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
aMulSieger des Minimalist Compo 01/13 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group