Programarea calculatoarelor 2 - Laborator 3

Obiective: Cunoașterea reprezentării binare a numerelor întregi și reale; lucrul cu operatori pe biți; conversia între formatul extern în cel intern.

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; }

Suplimentar, rezolvați problema pentru un număr real arbitrar. Calculați exponentul binar înmulțind sau împărțind repetat numărul cu 2, până când partea sa întreagă devine 1.
Suplimentar, citiți numărul real cifră cu cifră, fără a folosi formatul %f.
Marius Minea
Last modified: Thu Oct 21 06:59:05 EEST 2004