Fließkommaberechnung explizit erzwingen?

Anfängerfragen zum Programmieren mit PureBasic.
The Rookie
Beiträge: 14
Registriert: 19.04.2006 13:00

Fließkommaberechnung explizit erzwingen?

Beitrag 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.
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Re: Fließkommaberechnung explizit erzwingen?

Beitrag 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 
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
The Rookie
Beiträge: 14
Registriert: 19.04.2006 13:00

Beitrag 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.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag 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' 
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Int() ?
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Mach die Division halt einfach zum Schluss. Obs jetzt 1*10/2 oder 1/2*10 ist, das is doche egal...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Ah, endlich hab ich auch mal Recht... :mrgreen: Jetzt gänn ich mir erst mal nen leckeren
Bild
Benutzeravatar
Karl
Beiträge: 520
Registriert: 21.07.2005 13:57
Wohnort: zu Hause

Beitrag 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
The Kopyright Liberation Front also known as the justified ancients of Mumu!
PB 5.X
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

was is nun eigentlich damit...

gibts noch ne antwort von Rookie?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten