Forum: Mikrocontroller und Digitale Elektronik Fixpoint und es klingelt immer noch nicht.


von high-side (Gast)


Lesenswert?

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!

von Uhu U. (uhu)


Lesenswert?

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.

von Sebastian B. (mircobolle)


Lesenswert?

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

von Uhu U. (uhu)


Lesenswert?

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.

von Michael W. (wiebel42)


Lesenswert?

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

von high-side (Gast)


Lesenswert?

>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!

von Marco G. (stan)


Lesenswert?

Bei maximal 5 V bietet es sich doch an, FP 3.13 zu benutzen?
3 bit vor dem Komma -> Werte bis 7,x

von Karl H. (kbuchegg)


Lesenswert?

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.

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.