Forum: Mikrocontroller und Digitale Elektronik -0,x im 2er Komplement


von Patrick (Gast)


Lesenswert?

Hallo,

ich möchte für eine FFT-Realisierung auf einem FPGA mit Festkommazahlen 
im Zahlenbereich -1<= x <= 1 multiplizieren.

Leider ist mir nicht klar wie es möglich ist z.B. -0,25 darzustellen.

0,25 wäre ja z.B. mit 4,4 bit :

0000 0100

Aber wie komme ich jetzt das negative Vorzeichen hin?

Grüße und Danke
Patrick

von Alex J. (mjoelnir)


Lesenswert?

Hi

Soweit ich mich erinnere muss man einfach invertieren und 1LSB dazu 
addieren:
0000 0100
1111 1011
1111 1100

gruß

von Patrick (Gast)


Lesenswert?

Hi,

das habe ich auch so gemacht.

Möchte ich mir jetzt die Vorkammastelle anzeigen lassen, komme ich auf

1111 = (-1)

oder?

Bzw. heißt das, dass ich mir die Vorkommastelle gar nicht einzeln 
anschauen kann, sondern erst die ganze Festkommazahl zurückwandeln muss?

Gruß
Patrick

von Nosnibor (Gast)


Lesenswert?

Das hängt von deiner Definition für "Vorkommastelle" ab. Die hinteren 
vier Bit abzuschneiden bedeutet eben Abrunden auf die nächstkleinere 
ganze Zahl. Wenn da 1 herauskommt, heißt das, der genaue Wert lag 
zwischen 1 und 2. Kommt 0 heraus, lag der genaue Wert zwischen 0 und 1. 
Und für Werte zwischen -1 und 0 kommt eben  -1 heraus. Ist ja auch 
logisch, die 0 hätte ja sonst einen doppelt so großen Einzugsbereich wie 
alle anderen Ergebnisse.
Lösung: -1 als -0 ausgeben, -2 als -1 usw... das entspricht wohl eher 
der menschlichen Gewohnheit.

von c-hater (Gast)


Lesenswert?

Alex J. schrieb:
> Hi
>
> Soweit ich mich erinnere muss man einfach invertieren und 1LSB dazu
> addieren:
> 0000 0100
> 1111 1011
> 1111 1100

Das ist nur eine Möglichkeit. Allerdings eine, die aus praktischen 
Gründen sehr weit verbreitet ist. Auch bekannt als Zweierkomplement.

Oft gibt es spezialisierte Befehle, die es ersparen, zuerst das 
Einerkomplement zu bilden und dann eins zu addieren, um das 
Zweierkomplement zu bilden, sondern die Sache statt dessen in einer 
einzigen Operation erledigen.

von c-hater (Gast)


Lesenswert?

Patrick schrieb:

> Möchte ich mir jetzt die Vorkammastelle anzeigen lassen, komme ich auf
>
> 1111 = (-1)
>
> oder?
>
> Bzw. heißt das, dass ich mir die Vorkommastelle gar nicht einzeln
> anschauen kann, sondern erst die ganze Festkommazahl zurückwandeln muss?

Nein, daß heißt nur, das du ein anderes Rundungsverfahren für die 
Abbildung als Ganzzahl wählen mußt. Das von dir verwendete wird 
üblicherweise als "floor" bezeichnet, also abrunden auf die 
nächstkleinere ganze Zahl.

Runde einfach anders, sinnvoll wäre vielleicht z.B. 0.5 zum Wert zu 
addieren, bevor man sich die Ganzzahl anschaut. Dann kriegst du 
folgendes raus:

Intervall         gerundeter Wert
...
-1.5 <= n < -0.5  -1
-0.5 <= n <  0.5   0
 0.5 <= n <  1.5   1
...


Beispiele:

-0.25:

 1111 1100 ;-0.25
+0000 1000 ;+0.5
-----------------
 0000 0100 ;+0.25
=================
 0000 ;round:0

-0.75:

 1111 0100 ;-0.75
+0000 1000 ;+0.5
-----------------
 1111 1100 ;-0.25
=================
 1111 ;round:-1

von Kein Name (Gast)


Lesenswert?

Andere Betrachtungsweise.

Statt -1,00 ... 1,00 denkst du in -100% ... 100%. Dem 2er-Komplement ist 
vollkommen egal, wie du es betrachtest. Es kommen die selben Bits bei 
heraus.

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.