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.
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.