Programarea calculatoarelor 2 - Laborator 3

Obiective: Cunoașterea reprezentării binare a numerelor întregi și reale; lucrul cu operatori pe biți.

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

Marius Minea
Last modified: Wed Oct 15 07:28:30 EEST 2003