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.
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 –
Um Ihre Antwort zu erweitern, könnten Sie Ihre Antwort bearbeiten. –
Ich bin mir nicht sicher, was Sie mit ".5 d ist 1/2 ist 0.1b" meinen? Könnten Sie vielleicht mehr ausarbeiten? – vexe