Seite 1 von 2

Fließkommaberechnung explizit erzwingen?

Verfasst: 24.04.2006 13:42
von The Rookie
Hallo zusammen,

aus Geschwindigkeitsgründen sollte man ja hauptsächlich mit LONGs arbeiten.
Das Problem was ich habe, ist aber, das PB bei Verwendung von LONGs in Ausdrücken auch auschließlich im Ganzzahlenbereich arbeitet.

So ergibt z.B. '1 / 2 * 10' als Ergebnis '0' - statt '5'.
Auch ist '1 / 2 * 10' dadurch ja nicht gleich '1 * 10 / 2' - was ja methematisch gesehen eine Katastrophe ist.

Wie kann man PB denn in einem solchen Fall dazu ZWINGEN eine Berechnung mit Bruchzahlen durchzuführen?

Code: Alles auswählen

a.l = 1 
b.l = 2 
c.l = 10 
d.l = a/b*c       ; <=  Ergebnis = '0' 
e.l = 0.0+a/b*c   ; <=  Ergebnis = '5'
Debug d
Debug e
Eine Möglichkeit habe ich schon gefunden, und zwar durch eine zusätzliche Addition von 0.0 (also Debug 0.0+a/b*c) - wodurch ich dann ein korrektes Ergebnis erhalte.
Aber das kann doch nicht wirklich eine Lösung sein ... oder? :roll:

Dank und Gruß,
The Rookie.

Re: Fließkommaberechnung explizit erzwingen?

Verfasst: 24.04.2006 13:46
von stbi
The Rookie hat geschrieben:

Code: Alles auswählen

 
d.l = a/b*c       ; <=  Ergebnis = '0' 
e.l = 0.0+a/b*c   ; <=  Ergebnis = '5.0'
mach mal

Code: Alles auswählen

 
d.f = a/b*c  
e.f = 0.0+a/b*c 

Verfasst: 24.04.2006 13:58
von The Rookie
Sorry ... ich habe vergessen zu erwähnen, das ich als Ergebnisvariable natürlich auch nur einen Longwert benutzen möchte.
Die dadurch entstehende Ungenauigkeit beim Endergebnis ist oft genug ja auch vollkommen ausreichend und in o.g. Beispiel ist das Ergebnis ja ohnehin ohne Restwert.

d.f und e.f sind daher natürlich nicht das, was ich gesucht habe, da ich ja wie gesagt in einen Integer-Wert berechnen möchte.

Verfasst: 24.04.2006 14:12
von DrShrek
Verwende doch einfach eine entsprechende 'Vergrösserung':

Code: Alles auswählen

blower.l= 10
a.l = 1 
b.l = 2 
c.l = 10 
d.l = blower*a/b*c       ; <=  Ergebnis = '50' 

Debug d/blower           ; <=  Ergebnis = '5' 

Verfasst: 24.04.2006 17:56
von remi_meier
Int() ?

Verfasst: 24.04.2006 17:58
von hardfalcon
Mach die Division halt einfach zum Schluss. Obs jetzt 1*10/2 oder 1/2*10 ist, das is doche egal...

Verfasst: 24.04.2006 18:09
von Kaeru Gaman
genau.

1) das was hardfalcon vorgeschlagen hat, ist grundsätzlich wichtig.
wenn du nicht zwischendrin floats verwenden willst, sondern durchgehend integer,
mach die teilung zuletzt.

2) Dr.Shreck hat ein verfahren angeschnitten, dass man auch "Fixkomma" nennt.
hierbei arbeitest du mit einer grundsätzlichen kommaverschiebung,
also, alle werte die du verarbeitest sind z.b. 1000mal so groß,
erst bei der ausgabe rundest du oder gibst dementsprechen z.b. 3 nachkommastellen aus.
hier musst du besonders auf overflows achten, also darauf,
dass du nicht nach oben aus dem wertebereich hinausrechnest.

Verfasst: 24.04.2006 18:13
von hardfalcon
Ah, endlich hab ich auch mal Recht... :mrgreen: Jetzt gänn ich mir erst mal nen leckeren
Bild

Verfasst: 26.04.2006 09:46
von Karl
Wenn es um Division durch 2 geht, kann man die Longs problemlos nach rechts shiften:

Code: Alles auswählen

test.l = 10
MessageRequester("Test", Str(test >> 1))
Gruß Karl

Verfasst: 26.04.2006 11:41
von Kaeru Gaman
was is nun eigentlich damit...

gibts noch ne antwort von Rookie?