Forum: Mikrocontroller und Digitale Elektronik kurze Frage zu typecasts


von Karlo (Gast)


Lesenswert?

Hallo,

nachdem ich den Artikel zur Festkommaarithmetik gelesen habe konnte ich 
eine Formel wie folgt umstellen:

Original:
1
y = x / 2.5

Umgestellt:
1
1: y = (x*3) >> 3;
2
3
2: y = (x*410) >> 10;
4
5
3: y = (x*3277) >> 13;

Erstmal, sind diese Umstellungen korrekt? Sollte doch passen oder?

Problematischer sind aber die Datentypen.
x und y sind unsigned 16 Bit Variablen.

Formel 1 liefert fast den korrekten Wert, der Faktor 3 müsste aber 
eigentlich 3.2 heißen. Bei so niedrigen Zahlen ist das natürlich ne 
relativ hohe Abweichung.

Genauer sollten die Formeln 2 und 3 sein. Da ist relativ gesehen weniger 
Abweichung im Spiel.
Allerdings kommt was komplett falsches raus, vermutlich weil die 
Multiplikation in der Klammer zu einem Überlauf führt.

Kann mir jemand sagen wie und wo ich Typecasts platzieren müsste um das 
korrekte Ergebnis anschließend in y (16 Bit) zu platzieren ohne aber 
zuviel zu casten? Steh da bisl aufn Schlauch...

Viele Grüße,
Karlo

von Peter II (Gast)


Lesenswert?

warum meidest du die division, muss es denn extrem schnell gehen?

y = (x*2)/5;

von Rangi J. (rangi)


Lesenswert?

und was ist mit y = x * 2 / 5 ?

von Karlo (Gast)


Lesenswert?

Nein, muss es nicht.

Es soll eher ne kleine Übung zur Festkommaarithmetik sein weil ich sowas 
noch nie gemacht habe.
Und eleganter find ichs auch :-)
Bin grad dabei verschiedene Funktionen unterschiedlich zu implementieren 
(zB ItoA), einfach um ein Gefühl für die Möglichkeiten und Unterschiede 
zu bekommen.

Und gelernt hab ich bis jetzt in diesem Fall: je größer die 2er Potenz 
die benutzt wird desto genauer, nur brauchts irgendwann ne größere 
Variable...

Hat jemand noch nen Tipp zu wohlplatzierten Casts?

von Peter II (Gast)


Lesenswert?

Karlo schrieb:
> Es soll eher ne kleine Übung zur Festkommaarithmetik sein weil ich sowas
> noch nie gemacht habe.

aber eine (int) division ist doch Festkommaarithmetik - das ist doch 
genau was du willst.

von Karlo (Gast)


Lesenswert?

Ja, aber der Wikiartikel treibt das ganze noch weiter und ersetzt 
Divisionen durch Bit-Shifting. Das fand ich recht elegant und wollts 
nachmachen.

Außerdem würd ich danach gern Messen was performanter ist.

von Ingo (Gast)


Lesenswert?

Mein Taschenrechner spuckt immer den passenden Bruch dazu aus, den 
übernehme ich immer.

y = ((unsigned long) x* 4321)/1234;

So wird gecastet.


Ingo

von Karlo (Gast)


Lesenswert?

Vielen Dank, funkt perfekt :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.