Hallo,
für mein Projekt benutze ich eine kleine selbst geschriebene Fixed-Point
Bibliothek um Berechnungen im Format s15.16 durchführen zu können.
Bisher dachte ich eigentlich, dass diese gut funktionieren würde, doch
heute ist mir per Zufall aufgefallen, dass der Precompiler vorgegebene
Werte teilweise recht ungenau konvertiert. Zur Konvertierung nutze
folgende Typendefinition und ein entsprechendes Makro:
1 | typedef s15_16_t int32_t
|
2 |
|
3 | #define floatToFix(f) ((s15_16_t)( (f) * (1<<16) ))
|
Wenn ich nun z.B. 693,0983 konvertieren möchte und das durch den
AVRStudio Simulator jage, liefert mir dieser als Ergebnis 0x02B5192C
bzw. dezimal 45422892. Wenn ich das nun aber per Hand ausrechne bekomme
ich 693,0983 * 65536 = 45422890,1888. Nach Abschneiden der
Nachkommastellen ergibt das allerdings eine Differenz von 2! Obwohl es
mir logisch erscheinen würde, dass der Precompiler ebenfalls die Stellen
abschneidet, gebe es selbst im Fall dass er aufrundet immer noch einen
Unterschied von 1!
Wie ist dieses Verhalten zu erklären? Prinzipiell sollte eine einfache
Multiplikation von zwei solch gutmütigen Zahlen (beide in etwa in der
gleichen Größenordnung) doch nicht derartig ungenau sein! Kann jemand
dieses Verhalten reproduzieren oder hab ich vielleicht irgendwo anders
einen Fehler?
Achja, das ganze habe ich mit dem neuesten WinAVR-20090313 kompiliert.
Vielen Dank im voraus!
Gruß, krischi