2017-09-09 9 views
4

Je suis coincé sur un devoir de devoirs; J'ai besoin de convertir un flottant binaire en une fraction décimale. J'ai l'impression de comprendre le processus, mais je n'obtiens pas la bonne réponse. Voici mon processus de réflexion.Comment convertir des nombres flottants binaires en fractions décimales?

I ont le flotteur binaire: 0 000 101

  • La polarisation pour un champ d'exposant de 3 bits est de 3: 2^(3-1)-1 = 3
  • La mantisse devient 1.101 (base 2)
  • La valeur des bits d'exposant , 0, moins le nombre de bits de l'exposant, 3, est -3, de sorte que la décimale de la mantisse se déplace à gauche 3 places
    0.001101
  • En base 10, c'est-à-dire 2^-3 + 2^-4 + 2^-6, ce qui correspond à 0,203125 ou 13/64.

Cependant, 13/64 n'est pas la bonne réponse, l'auto-niveleuse ne l'accepte pas. Si ma réponse est fausse, alors je ne comprends pas pourquoi, et j'espère que quelqu'un peut me diriger dans la bonne direction.

Par pure chance, j'ai deviné 5/32 comme réponse et j'ai compris; Je n'ai aucune idée de pourquoi c'est le cas.

+0

que dit-elle la bonne réponse est? –

+0

une autre façon de regarder ce 0.001101 à droite ou à faux est le même que 1101/2^6 ou 13/64. donc votre exposant doit avoir tort? connaissant la bonne réponse devrait trier cela oui? –

+1

Par pure chance, j'ai deviné 5/32 comme réponse et je l'ai compris; Je n'ai aucune idée de pourquoi c'est le cas – Grav

Répondre

4

Dans les formats à virgule flottante IEEE-754, exponent = 0 est un dénormal, où le bit d'interlignage implicite dans la mantisse est 0.

Wikipédia a un bon article détaillé sur le format single-precision float (binary32), avec beaucoup d'exemples. Pour binary32 float, les formules sont (de l'article wiki):

(−1)^signbit × 2^(−126)  × 0.significandbits ; denormal, expbits=0 
(−1)^signbit × 2^(expbits−127) × 1.significandbits ; normal 
Inf or NaN (depending on mantissa aka significant); expbits = all 1s 

(Notez que 0.0 est un cas particulier de denormal, mais il est pas vraiment considéré comme un denormal).

Quoi qu'il en soit, avec un exposant nul, notez que l'exposant n'est plus expbits - bias, c'est un de plus.


Retour à votre cas: votre mantisse est 0,101 binaire, 0,625 décimal (je l'ai branché 0b101/8 en calc).

2^-2 * 0.101 (binaire) = 2^-2 * 0,625 (décimal) = 0,15625 = 5/32


Il y a un article de wikipedia https://en.wikipedia.org/wiki/Minifloat, qui mentionne (avec des exemples) un 8 -bit IEEE, ainsi que certains autres formats de moins de 32 bits utilisés dans la vie réelle sur du matériel graphique. (par exemple, 24 bits ou 16 bits). Fait amusant: x86 peut charger/stocker des vecteurs de flottants demi-précision 16 bits, en convertissant de/à partir de simples dans les registres à la volée avec le F16C ISA extension.

Voir aussi ce convertisseur en ligne avec des cases à cocher pour les bits: https://www.h-schmidt.net/FloatConverter/IEEE754.html