BlitzMax kann nicht rechnen - 100*2.55 = 254 ?!

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: BlitzMax kann nicht rechnen - 100*2.55 = 254 ?!

BeitragMi, Nov 24, 2010 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich bin gerade auf etwas komisches gestoßen. Ich habe in meinem Programm eine Alpha-Channel Angabe in Prozent. Um diese in ARGB-Werten zu verwenden, multipliziere ich a mit 2.55 um auf die eigentlichen Werte zu kommen, aber ob ihrs glaubt oder nicht: BlitzMax ist nicht in der Lage 100 * 2.55 zu rechnen.
Überzeugt euch selbst mit diesem Code:
BlitzMax: [AUSKLAPPEN]
Local a:Int = 100

a = a * 2.55

Print a


Ich bekomme als Ausgabe 254.

Ist dies ein exterm dummer Fehler meinerseits, oder ist das wirklich ein Fehler in BlitzMax?
Kann ich das irgendwie verhindern?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xeres

Moderator

BeitragMi, Nov 24, 2010 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Local a:Int = 100

a = a * 2.555

Print a
Print 2.55
Print 2.555
Kommastellen sind etwas Fehlerbehaftet.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Der Eisvogel

BeitragMi, Nov 24, 2010 22:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Oha, das ist aber öde. Danke Dir. Sieht aber nicht schön im Code aus.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xeres

Moderator

BeitragMi, Nov 24, 2010 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Integer-Rechnung ist ja auch vor zu ziehen - erst eine Float daraus machen, wenn du sie brauchst.
Code: [AUSKLAPPEN]
Local a:Int = 100

a = (a * 255) / 100.0
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Mi, Nov 24, 2010 22:12, insgesamt einmal bearbeitet

Der Eisvogel

BeitragMi, Nov 24, 2010 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, das sieht schöner aus. Danke.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

BladeRunner

Moderator

BeitragMi, Nov 24, 2010 22:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist allerdings kein BMax-Spezifisches Problem, sondern einfach eines was Flieskommazahlen allgemein betrifft. Du kannst die Fehler minimieren indem Du doubles nimmst, aber auch da wird es Ungenauigkeiten geben.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

mpmxyz

BeitragMi, Nov 24, 2010 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sind normale Ungenauigkeiten, die beim Rechnen mit Floats/Doubles auftreten.
Bei der Umwandlung in einen Integer wird nämlich nur abgerundet.
Ich weiß jetzt nicht, ob eine Rundungsfunktion schon vorhanden ist, aber diese hier sollte das richtig machen:
BlitzMax: [AUSKLAPPEN]
Function Round:Long(num:Double)
If num>=0
If (num Mod 1.0)>=0.5 Then Return Ceil(num)
Return Floor(num)
Else
If (num Mod 1.0)<=-0.5 Then Return Floor(num)
Return Ceil(num)
EndIf
EndFunction

mfG
mpmxyz
PS: Da war ich aber langsam. Razz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer
 

Macintosh

BeitragMi, Nov 24, 2010 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
zu spät.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group