Programarea calculatoarelor 2 - Laborator 5

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

Indicatii (pentru toate problemele): Lucram cu prespunerea ca structura unui float este, pornind de la bitul cel mai semnificativ:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM unde S = bitul de semn, E = exponent, M = mantisă.
Pentru numere normalizate, 0 < E < 255, si valoarea e dată de: (-1)^S * 2^(E-127) * 1.M .
Daca E = 0, M = 0, numarul e nul.

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 cazul in care sizeof(long) == 4 == sizeof(float) putem face conversia cu functiile

float bits2float(long l) { return *(float*)&l; }
long float2bits(float f) { return *(long*)&f; }
care returnează valoarea de la adresa data parametru, privita ca avand tipul dorit.
In C99 putem folosi in loc de long tipul int32_t din stdint.h, care sigur are 4 octeti (32 de biti).

O referință succintă despre formatul IEEE găsiți aici.

Problema 1 Citiți de la intrare un număr 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ă mai sus, luand in calcul succesiv fiecare bit din mantisa. Afișați numarul obtinut pentru comparație cu numărul citit inițial.

Problema 2 Citiți de la intrare un număr float (pentru simplificare, cu partea întreagă 1). Calculați succesiv primii 23 de biți din reprezentarea în baza 2 a mantisei, afisati-i, și formați cu ei o valoare de tip întreg. Completați tiparul cu semn și exponent, și afișați-l ca float pentru comparație cu numarul citit inițial.
Indicații: Fie f partea fracționară. Primul bit al mantisei este 0 dacă f < 0.5, altfel e 1. Deci, aflam primul bit dubland pe f si comparand cu 1. Scădem 1 din f pentru puterea lui 2 reprezentată de acest bit, daca e 1, si apoi repetăm procedeul.
Optional, 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.
Optional, citiți numărul real cifră cu cifră, fără a folosi formatul %f.

Problema 3 Scrieti si testati cu date de la intrare o functie care returneaza suma a doua numere float nenegative, normalizate, manipuland mantisa si exponentul, fara a folosi operatii aritmetice pe numere reale.
Indicatii: comparati exponentii celor doua numere si deplasati unul din numere pentru a ajunge la exponent comun. Rotunjiti mantisa in jos sau in sus dupa cum primul bit nereprezentabil (de ordin 2^-24) e 0 sau 1.

Problema 4 Scrieti si testati cu date de la intrare o functie care returneaza produsul a doua numere float normalizate, manipuland partile lor componente, fara a folosi operatii aritmetice pe numere reale.
Indicatii: Pentru a face produsul mantiselor, folositi fie un tip intreg care sa poata cuprinde intreg rezultatul, fie un algoritm de inmultire care calculeaza bitii semnificativi din produs, fara a fi nevoie de numar suplimentar de biti. Rotunjiti mantisa in jos sau in sus dupa cum primul bit nereprezentabil (de ordin 2^-24) e 0 sau 1.


Marius Minea
Last modified: Mon Oct 31 10:12:28 EET 2005