Fixpoint ist ein ziemlich leidiges Thema für mich...
Im Grund weiss ich ja was Fixpoint ist, aber ich tue mir mit der
praktischen Umsetzung immer noch schwer.
Nehmen wir an:
U_ref = 5 V
Nun haben wir einen Fixpoint Datentyp 8.8: Also 8 Vorkommabits und 8
Nachkomma Bits.
Nun sagen wir das LSB ist 70.6 uV (mikrovolt)
Nun aber zur "Praxis":
0x02EF soll der Fixpoint Wert sein.
02 = 2 als vorkommastelle... ok
EF = 239 als Nachkommastelle
(239/256) = 0,93359375
LSB ist ja 70.7 uV
---------------------------------
Wo liegt mein Denkfehler?
Bzw, wie verrechne ich den LSB von 70.7 uV
---------------------------------
Mir erschliesst sich auch noch nicht, wie ich dann gewinnbringend mit so
einem Fixpoint Wert im Code umgehe. Fuer mich sieht es mit dieser
faktoren multiplikation / division eher nach mehr Aufwand aus, als z.B.
alles mit 1mV / Bit (LSB) zu codieren...
Cheers!
Fixedpoint 0x02EF = 2 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256
Rechts stehen Dezimalwerte in Bruchdarstellung.
Die Stellenwertigkeit der Nachkommabits ist also 2^-1, 2^-2, ...
Der Gewinn des Formates ist, daß man sie wie int-Formate addieren und
subtrahieren kann.
Uhu Uhuhu wrote:
> Fixedpoint 0x02EF = 2 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256>> Rechts stehen Dezimalwerte in Bruchdarstellung.>> Die Stellenwertigkeit der Nachkommabits ist also 2^-1, 2^-2, ...>> Der Gewinn des Formates ist, daß man sie wie int-Formate addieren und> subtrahieren kann.
0xEF = 239 (DEZ)
239 / 256 = 0,93359375
Das ist das gleiche Ergebnis wie von Uhu. Nur einfacher ;-)
Mhm. Also wenn LSB = 70.6uV ist dann sind doch 239 => 239 * 70uV =
0,01673 V
=> 2 + 0,01673 = 2,01673 V
Wie schon von Uhu erwähnt, ist der Vorteil, dass man mit normalen
Operationen rechnen kann.
ZUr Einfachheit nehmen wir mal an dass das LSB 1mV/Bit ist.
Zahl1: 3.598 V => 0.598 * 256 = 153,088 => 0x99
=> Fehler: 0.598 -0,59765625 = 0,001475
Zahl2: 1.8603 V => 0.8603 * 256 = 220,2368 => 0xDC
=> Fehler: 0.8603 - 220,2368 = 0,000925
Zahl1 - Zahl2 = 0x0399 - 0x01DC = 0x01BD
0xBD = 189 / 256 = 0,73828125
Ergebnis = 1,73828125
Fehler: 1,7377 - 1,73828125 = -0,00058125
Ich hoffe das hilft zum Verständnis :)
Viele Grüße und gute nacht
Sebastian B. wrote:
> Uhu Uhuhu wrote:>> Fixedpoint 0x02EF = 2 + 1/2 + 1/4 + 1/8 + 1/32 + 1/64 + 1/128 + 1/256>>>> Rechts stehen Dezimalwerte in Bruchdarstellung.>>>> Die Stellenwertigkeit der Nachkommabits ist also 2^-1, 2^-2, ...>>>> Der Gewinn des Formates ist, daß man sie wie int-Formate addieren und>> subtrahieren kann.>> 0xEF = 239 (DEZ)>> 239 / 256 = 0,93359375> Das ist das gleiche Ergebnis wie von Uhu. Nur einfacher ;-)
Kleiner Schlaui. Es ging mir nicht darum zu zeigen, wie man es
ausrechnet, sondern wie man das Modell der Stellenwertigkeit so
erweitert, daß auch gebrochen Werte damit behandelt werden können.
Aber die Wertigkeit deines LSB ergibt sich doch rein rechnerisch aus der
Darstellung. Wenn du 8.8 hast und die Einheit Volt sein soll dann ist
Dein LSB = (1/256) V = 3,90625 mV und NICHT "sagen wir mal 70,6uV".
Ansonsten hast du eben deinen LSB=70.6uV, dann entspricht aber eine bei
dir dargestellte 1.0 (0x0100) in der 8.8 notation nicht 1.0V sondern
1.0*(256*70,6uV)=0.0180736V was keinen Sinn macht, dann kannst Du
nämlich gleich bei INT bleiben.
Oder versteh ich die Problematik hier falsch. -wiebel
>Aber die Wertigkeit deines LSB ergibt sich doch rein rechnerisch aus der>Darstellung. Wenn du 8.8 hast und die Einheit Volt sein soll dann ist>Dein LSB = (1/256) V = 3,90625 mV und NICHT "sagen wir mal 70,6uV".
Dieser Punkt macht mich ja auch stutzig, aber prinzipiell ist doch die
Wertigkeit des LSB "beliebig" wählbar?
>Ansonsten hast du eben deinen LSB=70.6uV, dann entspricht aber eine bei>dir dargestellte 1.0 (0x0100) in der 8.8 notation nicht 1.0V sondern>1.0*(256*70,6uV)=0.0180736V was keinen Sinn macht, dann kannst Du>nämlich gleich bei INT bleiben.
Jetzt bin ich verwirrt. Ich dachte 8.8 heisst: Nach 8 Bits kommt ein
Komma. Also: 0x01.00 -> 1.00 V ! ?
>Oder versteh ich die Problematik hier falsch. -wiebel
Versteh die Problematik ja selbst nicht genau ;-)
Danke!
high-side wrote:
>>Aber die Wertigkeit deines LSB ergibt sich doch rein rechnerisch aus der>>Darstellung. Wenn du 8.8 hast und die Einheit Volt sein soll dann ist>>Dein LSB = (1/256) V = 3,90625 mV und NICHT "sagen wir mal 70,6uV".>> Dieser Punkt macht mich ja auch stutzig, aber prinzipiell ist doch die> Wertigkeit des LSB "beliebig" wählbar?
Ja, aber nur über die Anzahl der Bits die du gewillt bist, dafür
abzustellen
Du kannst ja in deinem gewohnten Zehenersystem auch nicht hergehen und
einfach sagen:
ich will 2 Nachkommastellen, aber die 2. Stelle nach dem Komma sollen
nicht Hunderstel sein, sondern Ein-79-tel.
Klar dass sich dann hint und vorne nichts mehr ausgeht.