2016-04-16 10 views
0

Ich versuche also, meinen Kopf um Festkommazahlen zu wickeln. So weit, ist es gut. Das einzige, was mich verwirrt hat, ist der "Bruchteil" der Nummer.Festkomma-Bruchteil verstehen

Mein Verständnis von Festkommazahlen ist, dass es die Binärzahl nach der Skala (die in diesem Fall ist gleich acht Bits) teilt. Die linke Seite wäre der ganzzahlige Teil und der Bruch ist rechts. XXX.Y Dabei sind XXX die drei Bytes für den Integer/ganzen Teil und Y ist ein Byte für den Bruchteil (bitte korrigieren Sie mich, wenn ich falsch liege).

Lassen Sie uns die folgenden Makros nehmen:

#define FIX_SCALE 8 
#define FIX_FRACTION_MASK ((1 << FIX_SCALE) - 1) 
#define FIX_WHOLE_MASK ~FIX_FRACTION_MASK 
#define FIX_FROM_FLOAT(X) ((X) * (1 << FIX_SCALE)) 
#define FIX_TO_FLOAT(X) ((float)(X)/(1 << FIX_SCALE)) 
#define FIX_TO_INT(X) ((X) >> FIX_SCALE) 
#define FIX_FROM_INT(X) ((X) << FIX_SCALE) 
#define FIX_FRACTION(X) ((X) & FIX_FRACTION_MASK) 
#define FIX_WHOLE(X) ((X) & FIX_WHOLE_MASK) 

folgendes Beispiel:

int Fixed = FIX_FROM_FLOAT(2.5f); 

Der resultierende Integer-Wert ist 640, 0x280 in hex und 0000 0000 0000 0000 0000 0010 1000 0000 in binär.

Lassen Sie uns die ersten beiden Bytes nehmen: 0000 0010 1000 0000

Ich verstehe, wo das 0000 0010 herkommt, es ist der Integer-Teil (2). Aber was ich nicht bekomme, ist die 1000 0000, die der Bruchteil ist. Ich sehe nur nicht, wie sich das auf die Zahl 5 bezieht (die 0101 in binär ist). Ich hätte so etwas wie 0101 0000 oder 0000 0101 erwartet - Klar, dass ich ein grundlegendes Konzept hier falsch verstehe.

Wenn ich schreiben:

int Fraction = FIX_FRACTION(Fixed); 

würde ich 128 bekommen (0x80 in hex Sinn macht weil es den ganzzahligen Teil maskiert, die 2 ist.). Das erste Mal, als ich schrieb, dass ich erwartete, eine 5 zurück zu bekommen.

ich 0.5 tun, wenn ich schreibe:

float Fraction = FIX_TO_FLOAT(FIX_FRACTION(Fixed)); 

Könnte jemand für mich, diese Verwirrung löschen? Warum hat die Bruchzahl 0000 1000 keine 101 drin? Warum mussten wir die FIX_TO_FLOAT auf FIX_FRACTION tun, um den richtigen Bruchteil zu bekommen?

Danke.

Antwort

0

Vergleich Zahlenmuster in dezimaler und binärer Darstellung nicht funktioniert. Lets über Festpunktzahl für einen Moment vergessen und einen Blick auf den binären Darstellungen von 5 haben und 50:

5: 0000'0101 
50: 0011'0010 

Wie Sie 5 nicht in der binären Darstellung zu finden, das binäre Muster einer dezimal sehen können dezimal 50 entweder.

Nun, warum dezimal 0,5 ..00'1000'0000 in Q23 zu verstehen.8 binäre, müssen Sie die Binär-zu-Dezimal-Umwandlung Regel folgen:

alle 1 mit 2^Position ersetzen und die Zahlen addieren sich

position:  7 6 5 4 3 2 1 0 -1-2-3-4 -5-6-7-8 
binary number: 0 0 0 0 0 0 1 0 . 1 0 0 0 0 0 0 0 

2^1 + 2^-1 = 2 + 0,5 = 2.5

-1

Die binären Werte rechts von der. 1/2 1/4 1/8 usw. sind Daher 10.1 binäre 2,5

+0

Um auf meine Antwort-binär zu erweitern ist ein Zahlensystem keine Codierung. Es ist Basis zwei statt Basis zehn. .5 d ist 1/2 ist 0.1b –

+1

Um Ihre Antwort zu erweitern, könnten Sie Ihre Antwort bearbeiten. –

+0

Ich bin mir nicht sicher, was Sie mit ".5 d ist 1/2 ist 0.1b" meinen? Könnten Sie vielleicht mehr ausarbeiten? – vexe