Rechen mit großen Zahlenwerten

Gast #1704492
Lesenswert?

Hallo, ich möchte in meinem Programm eine Berechnung ausführen (AVRGCC 
20100110, Atmega16) und zwar:
x = ( l*m*100 ) / ( d*a )
mit l=0...500; m=0...1023; d=1...250 a=1...1023

Wie kann ich diese Berechnung am Besten implementieren?

Hab schon diverse Varianten ausprobiert und bekomme im AVR Simulator und 
auf der Zielhardware immer wieder falsche Ergebinsse.

z.B.: für: temp=(uint16_t)((d*a)/1024); liefert der Simulator als 
Ergebnis mit d=250 und a=800 temp=3 obwohl es 195 seien sollten.
Wie bekomme man den Überlauf der Zahlen (d*a) wärend der Berechung in 
den Griff? Kann das der Compiler von sich aus?

Danke für die Hilfe.
Gast #1704534
Lesenswert?

Hallo vielen Dank euch Beiden. Hab jetzt in der Berechnung bei den 
Überläufen auf 32bit Variable gecastet und jetzt funktioniert die 
Rechnung. Auf die 2. Variante hätte ich auch selber kommen können....
Schönen Abend noch.
Gast #1704547
Lesenswert?

Hi,

ja ja die bösen Integer ;-)

aber mal im ernst, UINT16 => 2^16 => 0..65535

du musst bei deiner Berechnung sicherstellen das der Datenbereich nicht 
überlaufen wird. Dabei verlierst du allerdings an Genauigkeit. (einen 
Tot muss man ja sterben ;-) )

Genrell musst du versuchen durch geschicktes skalieren des Dividenden 
und zerlegen des Divisors innerhalb deiner gegebenen grenzen zu bleibe.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren