Moin,
ich versuche auf einem Cortex M0 eine Division mit Festkommaartihmetik
hinzubekommen. Aber irgendwie will das nicht.
Der Code stammt aus einem Programmierbeispiel, den ich etwas abgewandelt
habe, liefert aber nicht das richtige Ergebnis.
1 | typedef int32_t fx_t;
|
2 |
|
3 | #define FX_FRAC 12 // define position of decimal point
|
4 | // explanation: FX_FRAC = 12 ==> 20 Bit for Integer-Value, 12 for fractional value
|
5 |
|
6 | #define fx_float(a) (a / (float)(1LL<<FX_FRAC))
|
7 | #define fx_make(a) ((fx_t)(a * (1LL<<FX_FRAC)))
|
8 | #define fx_add(a,b) (a + b)
|
9 | #define fx_sub(a,b) (a - b)
|
10 | #define fx_mul(a,b) ((fx_t)(((int64_t)a * b) >> FX_FRAC))
|
11 | #define fx_div(a,b) ((fx_t)(((int64_t)a << FX_FRAC) / b))
|
12 |
|
13 | uint32_t zahl = 934;
|
14 | zahl = fx_make(zahl);
|
15 | uint32_t teiler = 33;
|
16 | teiler = fx_make(teiler);
|
17 | uint32_t ergebnis = 0;
|
18 | ergebnis = fx_div(zahl, teiler);
|
Der Integerteil ist ok und gibt korrekt 28 aus, aber der Nachkommateil
stimmt zumindest mit meinem Taschenrechner nicht überein... ;-)
Weiß jemand, was hier nicht stimmt? ich hab schon allerhand Tutorials
zum Thema FPA gelesen, aber irgendwie fehlt noch der Sprung in die
Praxis.
Besten Dank
Caradhras