Problema 1
Citiți de la intrare un număr real (float) și afișați componentele
reprezentării sale interne: numerele întregi formate din cei 8 biți
de exponent și respectiv cei 23 de biți de mantisă. Folosind acestea,
recalculați valoarea numărului real, cu formula cunoscută pentru
reprezentare, și comparați prin afișare 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ă. E suficient pentru început să tratați doar cazul numerelor
normalizate nenule, cu valoarea dată de: (-1)^S * 2^(E-127) * 1.M .
Pentru a obține un întreg cu același tipar de biți ca și numărul real dat,
folosiți funcția:
long float2longbits(float f) { return *(long*)&f; }Pentru separarea componentelor numărului folosiți operatorii pe biți.
O referință succintă despre formatul IEEE găsiți aici.
Problema 2
Citiți de la intrare reprezentarea cu cifre zecimale a unui număr real
(pentru simplificare, cu partea întreagă 1). Calculați, prin împărțire
succesivă, valoarea în baza 2 a mantisei. Creați într-un număr întreg
(long) tiparul corespunzător reprezentării binare a numărului
real dat, și afișați-l pentru comparație cu cel introdus.
Indicații de rezolvare
Partea întreagă a numărului dat se poate citi ca întreg. Tratați întăi
cazul când ea este 1, și eventual apoi cazul general. Citiți partea
fracționară cifră cu cifră (s-ar putea citi și ca șir de caractere, și
converti cu funcțiile atoi, atol sau strtol
pe care le vom discuta ulterior). Citirea a doi întregi cu formatul
"%d.%d" are fi incorectă (de ce ?).
Calculați mantisa cifră cu cifră (folosind deplasarea la stânga) din
împărțirea frac/10^n unde frac e partea fracționară
citită (ca număr zecimal), iar n numărul de cifre. î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; }