1
votes

Conversion d'un nombre en IEEE 754

Quelqu'un peut-il m'aider avec cette question:

"Convertissez le nombre décimal 10/32 en virgule flottante IEEE 754 32 bits et exprimez votre réponse en hexadécimal. (Rappel: les 32 bits sont utilisés comme suit: Bit 1: signe de la mantisse, bits 2-9: 8 bits d'exposant en excès de 127, bits 10-32: 23 bits pour la grandeur de la mantisse.) »

Je comprends comment convertir un nombre décimal en IEE 754. Mais je ne sais pas comment répondre à cela - cela ne me donne qu'un quotient? Je ne suis pas autorisé à utiliser une calculatrice, donc je ne sais pas comment résoudre ce problème. Dois-je d'abord les convertir en binaire et les diviser?


1 commentaires

J'ai supprimé «équation» du titre car «10/32» n'est pas une équation. Une équation a un signe égal et indique que deux choses ont la même valeur. «10/32» est simplement une expression ou un nombre rationnel. J'ai laissé le «nombre décimal» incorrect parce qu'il est entre guillemets, donc il vient probablement d'une autre source. Cette source est fausse; «10/32» n'est pas un nombre décimal. C'est une expression qui utilise deux nombres décimaux, et elle peut être considérée comme un nombre rationnel en raison de la définition des nombres rationnels comme les ratios d'entiers.


3 Réponses :


0
votes

Donner la conversion de 10/322 sans calculatrice comme exercice est du pur sadisme.

Il existe une méthode générale faisable sans outils, mais cela peut être fastidieux.

3/14  -> 6/14  e=1 m=0  
6/14  -> 12/14 e=2 m=00
12/14 -> 24/14-14/14=10/14 e=3 m=001
10->14 -> 20/14-14/14=6/14 e=4 m=0011
6/14   -> 12/14 e=5 m=00110

Ensuite, il vous suffit de coder la mantisse et (23-exp) au format IEEE.

Notez que fréquemment ce type de calcul conduit à des boucles. Chaque fois que vous trouvez le même n, vous savez que la séquence sera répétée.

À titre d'exemple, supposons que nous devons coder 3/14

N is the number to code. We assume n<1
exp=0
mantissa=0 
repeat 
  n *= 2
  exp ++
  if n>1
    n = n-1
    mantissa = mantissa <<1 | 1
  else
    mantissa = mantissa <<1
until mantissa is a 1 followed by 23 bits

Super, nous avons trouvé une boucle!
6 / 14-> 12 / 14-> 10 / 14-> 6/14.
Donc, la mantisse sera 110 itérée comme requis 110110110 ...

Si nous remplissons la mantisse avec 24 bits, nous avons besoin de 26 itérations et l'exposant est 23-26 = -3 (une autre façon de l'obtenir est de remarquez que n est devenu> 1 pour la première fois à l'itération 3 et l'exposant est -3 comme 1≤3 / 14 * 2 ^ 3

Et nous pouvons faire le codage IEEE754 avec exposant = 127 -3 = 124 et mantisse = 1.1011011011011 ....


2 commentaires

Salut, j'apprécie la réponse bien écrite. Cependant, il s'agit d'un test papier et il ne valait que 6 points, donc je ne pense pas qu'un tel travail soit nécessaire. En fait, j'ai fait une faute de frappe dans la question d'origine, elle ne demandait pas la réponse de 10/322, elle demandait en fait 10/32 (avec 32 étant la base 2), voici une image de ce à quoi ressemble la question (va faire il est plus facile à comprendre): gyazo.com/fde9db7ec588fe088e8a73014e8f74d4 - Je suppose que je pourrais diviser les nombres binaires? C'est à dire. diviser 10 en binaire par 32 et partir de là? Aucun conseil? Merci.


10/32, je comprends. La méthode que je présente est générale et peut traiter n'importe quelle fraction (désagréable), comme ce fut 10/322. Mais si le dénominateur est une puissance de 2, encodez le numérateur en binaire et décalez le point comme dans la méthode proposée par Eric Postpischil.



1
votes

10/32 = 5/16 = 5 • 2 −4 = 1,25 • 2 −2 = 1,01 2 • 2 −2 .

Le signe est +, l'exposant est −2 et le significande est 1,01 2 .

Un signe positif est codé comme 0.

L'exposant −2 est codé comme −2 + 127 = 125 = 01111101 2 .

Significand 1.01 2 est 1.01000000000000000000000 2 , et il est encodé en utilisant les 23 derniers bits, 01000000000000000000000 2 .

En les rassemblant, le codage IEEE-754 est 0 01111101 01000000000000000000000. Pour convertir en hexadécimal, organisez d'abord en groupes de quatre bits: 0011 1110 1010 0000 0000 0000 0000 0000 0000. Ensuite, l'hexadécimal peut être facilement lu: 3EA00000 16 .


0 commentaires

0
votes

Je le vois comme ceci:

10/32 =        // input
10/2^5 =       // convert division by power of 2 to bitshift
1010b >> 5 =
.01010b        // fractional result
--^-------------------------------------------------------------
  |
first nonzero bit is the exponent position and start of mantissa
----------------------------------------------------------------
man = (1)010b           // first one is implicit
exp = -2 + 127 = 125    // position from decimal point + bias
sign = 0                // non negative
----------------------------------------------------------------
0 01111101 01000000000000000000000 b
^    ^                ^
|    |            mantissa + zero padding
|   exp
sign
----------------------------------------------------------------
0011 1110 1010 0000 0000 0000 0000 0000 b
   3    E    A    0    0    0    0    0 h
----------------------------------------------------------------
3EA00000h

Oui, la réponse d'Eric Postpischil est la même approche (+1 btw) mais je n'ai pas aimé la mise en forme car elle n'était pas claire d'un regardez d'abord ce qu'il faut faire sans lire correctement le texte.


0 commentaires