Float

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

LordArtus

Betreff: Float

BeitragMi, Sep 19, 2007 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ,
ich wusste gar nicht , dass Float so genau ist Wink

Code: [AUSKLAPPEN]

' Das Ergebnis soll 1000000 sein

x1:Float=0
x2:Double=0

time=MilliSecs()
For i=0 To 100000000
   x1=x1+0.01
Next
time=MilliSecs()-time

Print "Float: "+x1+"  "+time+"ms"

time=MilliSecs()
For i=0 To 100000000
   x2=x2+0.01
Next
time=MilliSecs()-time

Print "Double: "+x2+"  "+time+"ms"


und ich suche wie der Depp nach Fehlern in meinen Code Laughing
Also ich frage mich dann wozu Float gut sein soll ???

MfG

LordArtus

mahe

BeitragMi, Sep 19, 2007 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist das Ergebnis von 100000000 kleinen Rundungsfehlern ...
ʇɹǝıdɯnɹɹoʞ ɹnʇɐuƃıs - ǝpoɥʇǝɯ-ɹoɹɹıɯ ɹǝp uı ,ɹoɹɹǝ,

Lunatix

BeitragMi, Sep 19, 2007 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep, wer schlau ist, und sich die Datentypen mal genauer anschaut, z.b. auf Blitzbase.de, der sieht :

Code: [AUSKLAPPEN]
 Assembler:   single
C++:   float
Blitz:   float
MIN:   1.17549e-38
MAX:   3.40282e+38
Genauigkeit:   1.19209e-07
Kommastellen:  6
 
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...

LordArtus

BeitragMi, Sep 19, 2007 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ok,

(6 Kommastellen) , was gibts bei 0.01 abzurunden ?

Da muss ich mir jetzt extra selber ein Code schreiben , damit 0.01 auch wirklich 0.01 ist , oder was ?

MfG

LordArtus

BladeRunner

Moderator

BeitragMi, Sep 19, 2007 22:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
100000000
hat mehr als 6 Stellen, da gibst Du mir recht, oder ?
Und wenn du 100000000 *.01 nimmst bist Du immer noch über der Genauigkeitsgrenze von Floats, denn dann hat es immernoch 7 Stellen.
Zudem gibt es - und das liegt einfach an der Art der Speicherung in Exponent und Mantisse - einige Zahlenwerte die nur unzureichend dargestellt werden können und daher Ungenauigkeiten verursachen. Je mehr Nachkommastellen möglich sind umso kleiner der potentielle Fehler und umso länger dauert es bis er auffällt. Ganz ausschalten kann man ihn aber nicht.

Float hat also durchaus seine Existenzberechtigung, man muß sich nur überlegen in welchem Zahlenraum eine Variable benutzt wird.
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

LordArtus

BeitragMi, Sep 19, 2007 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich will nicht klugscheissern oder so , aber setz die schleife mal auf 10000 zb. oder ganz einfach:

Print 0.01

oder

x=1000/249.0
print x*249 ' sollte eigentlich 1000 sein Wink

So wie ich es in Erinerrung habe (schon lange nichts gemacht) , kann man , bei C# und C++ , selber bestimmen mit wieviel Kommastellen man rechnen will (ist mir schon klar , dass man die Grenzen von Float oder Double nicht Überschreiten darf.Die sind eh nur 32bit oder 64bit) , aber es sollte wenigstens im BMax möglich sein , die Zahlen selber abzurunden oder , dass der Compiler erkennt , aha ich arbeite jetzt mit 2 Nachkommastellen , und nicht , dass 0.01 in 0.00999999..... irgenwas umgewandelt wird(so wie eigentlich der Komp die Zahlen abspeichert).Das ist doch Basic und nicht Assembler.
Klar für Berechnungen zur Ausgaben auf den Bildschirm reicht da Float , aber ich brauche es für Beschleunigung auf einer ziemlich grossen Map (nicht nur Anzeige) , die Position wird innerhalb der Map berechnet.So weit so gut , da reicht auch Float , aber ich will dazu die Beschleunigung FPS unabhängig machen , es funktioniert , bloss bei zu viel FPS-Unterschied zu den Standard-FPS auf die ich optimiere , sieht es nicht mehr so aus , wie es eigentlich aussehen sollte und da ist es wirklich nötig , dass alle Nachkommastellen auch stimmen.

MfG

LordArtus

BladeRunner

Moderator

BeitragMi, Sep 19, 2007 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Da sind wir leider an die etwas veraltete MinGW-Version gebunden die da leider etwas schlampig ist. Ich würde Dir daher wenn es sehr genau sein muss zu doubles raten - der Geschwindigkeitsverlust sollte moderat sein und ein paar byte speicher werden auch nicht so schnell zum Problem.
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

LordArtus

BeitragMi, Sep 19, 2007 23:15
Antworten mit Zitat
Benutzer-Profile anzeigen
hab schon auf Double umgestellt Wink
Aber trotzdem würde ich es gerne wissen , ob es verbessert wird ?
Vielleicht weiss jemand von Euch etwas dazu.
zb. ne Rundungsfunktion , wäre echt super.

MfG

LordArtus

Abrexxes

BeitragMi, Sep 19, 2007 23:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Sibly hat bereits angekündigt das demnächst auch die aktuellste MinGW unterstützt wird. Er sagte "soon" was also vor 2010 sein sollte.

cu
 

#Reaper

Newsposter

BeitragDo, Sep 20, 2007 15:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Btw: @LordArtus: Bei

x=1000/249.0
print x*249

kommt auch 1000 raus, wenn man auch x nicht auf Integer lässt, sondern auf Float umstellt Wink
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

LordArtus

BeitragFr, Sep 21, 2007 12:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja , stimmt Reaper Embarassed

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group