Problema 1
Citiți de la intrare un număr real (float) și afișați componentele
reprezentării sale interne: semnul, cei 8 biți de exponent (ca număr întreg),
și cei 23 de biți de mantisă (ca șir de cifre 0 sau 1).
Din aceste componente, recalculați valoarea numărului real, cu formula
dată la curs, și afișați-l pentru comparație cu numărul inițial introdus.
Indicații de rezolvare Structura unui float este, pornind
de la bitul cel mai semnificativ:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
unde S = bitul de semn, E = exponent, M = mantisă. Tratați pentru început
doar cazul numerelor normalizate nenule, cu valoarea dată de: (-1)^S *
2^(E-127) * 1.M . Pentru a-l prelucra, tiparul de biți care reprezintă
numărul real trebuie privit ca și un întreg, deoarece operatorii pe biți
se aplică doar la tipuri întregi. Pentru aceasta, puteți scrie
funcția
long float2longbits(float f) { return *(long*)&f; }care returnează un număr long cu același tipar pe biți ca și numărul real dat.
O referință succintă despre formatul IEEE găsiți aici.
Problema 2 Citiți de la intrare un număr real float
(pentru simplificare, cu partea întreagă 1). Calculați succesiv primii
23 de biți din reprezentarea în baza 2 a mantisei și formați cu ei o
valoare de tip întreg (long). Completați-l cu semn și exponent
corespunzător reprezentării binare a numărului real dat, și afișați-l
ca float pentru comparație cu acesta.
Indicații de rezolvare Fie f partea fracționară. Primul
bit al mantisei este 0 dacă f < 0.5, altfel e 1. Deci, dublăm
pe f; dacă e < 1, avem un bit de 0, dacă nu, un bit de 1, și
în acest caz scădem 1 din f pentru puterea lui 2 reprezentată de
acest bit. Apoi repetăm procedeul. Biții pot fi introduși de la dreapta
într-un long care se deplasează la fiecare pas cu o poziție.
Acesta poate fi inițializat cu tiparul pentru exponent (și eventual semn)
pe ultimii biți, obținându-se automat alăturarea lor. În final, pentru a
atribui la un float tiparul de biți obținut, folosiți funcția:
float long2floatbits(long l) { return *(float*)&l; }