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?
3 Réponses :
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 ....
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.
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 .
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.
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.