Despre infinit și alte (ne)numere (II)

În episodul anterior am văzut cum sunt reprezentate în memorie numerele zecimale și ne-am jucat puțin cu cele două tipuri de zerouri. Acum vom vedea cum putem "ajunge la infinit".

Infinituri

Există mai multe operații matematice ale căror rezultate sunt ∞. Cea mai simplă dintre ele este împărțirea unui număr nenul la 0.

Pentru numerele întregi, împărțirea la 0 duce la apariția unei erori, dar pentru numerele reprezentate în virgulă mobilă avem valori speciale pentru infinit (atât pentru +∞, cât și pentru -∞).

În Java, sunt definite constante pentru aceste valori; așadar, putem vedea foarte simplu cum sunt ele reprezentate.

Valorile afișate sunt:

Observăm că diferă doar bitul de semn (la fel ca în cazul celor două zerouri). Pentru +∞ bitul respectiv este 0, iar pentru -∞ bitul este 1. Toți biții care formează exponentul au valoarea 1 și toți biții care formează mantisa au valoarea 0.

Exponentul format doar din biți cu valoarea 1 indică faptul că avem un infinit. Cea mai mare valoare reprezentabilă nu poate avea toți acești biți cu valoarea 1 (ultimul este 0). Avem în Java o constantă și pentru ea și putem vedea simplu care este reprezentarea.

În urma executării obținem:

Împărțirea la Zero

Așa cum spuneam, o modalitate simplă de a obține infinituri este împărțirea la 0. Dacă împărțim la 0 un număr pozitiv obținem +∞, iar dacă împărțim la 0 un număr negativ obținem -∞. Vom vedea în episodul următor ce se întâmplă dacă împărțim 0 la 0. Dar... avem două tipuri de zerouri.

Așa cum probabil vă așteptați, dacă împărțim un număr pozitiv la un zero negativ, rezultatul este -∞. Similar, dacă împărțim un număr negativ la un zero negativ, rezultatul este +∞. Reprezentările afișate sunt:

Adunări și scăderi

Dacă adunăm sau scădem o valoare finită (oricât de mare) dintr-un infinit, rezultatul este acel infinit. Același lucru se întâmplă dacă adunăm infinit la infinit. Vom vedea în episodul următor ce se întâmplă dacă scădem infinit din infinit.

Rezultatul fiecăreia dintre primele patru operații va fi +∞, iar rezultatul celorlalte va fi -∞:

Înmulțiri și împărțiri

Dacă înmulțim +∞ cu un număr pozitiv rezultatul va fi +∞, iar dacă îl înmulțim cu un număr negativ rezultatul va fi -∞. Similar, dacă înmulțim -∞ cu un număr pozitiv rezultatul va fi -∞, iar dacă îl înmulțim cu un număr negativ rezultatul va fi +∞. În episodul următor vom vedea ce se întâmplă dacă înmulțim un infinit cu 0.

Dacă împărțim +∞ la un număr pozitiv rezultatul va fi +∞, iar dacă îl împărțim la un număr negativ rezultatul va fi -∞. Similar, dacă împărțim -∞ la un număr pozitiv rezultatul va fi -∞, iar dacă îl împărțim la un număr negativ rezultatul va fi +∞. Afirmațiile rămân adevărate chiar dacă împărțim la zero (pozitiv sau negativ).

Obținem:

Comparații

Infiniturile pozitive sunt egale între ele; la fel și cele negative. Evident, infinitul pozitiv este mai mare decât cel negativ. Infinitul pozitiv este mai mare decât orice valoare finită, iar cel negativ este mai mic decît orice valoare finită.

Se va afișa true pentru fiecare dintre comparațiile din programul următor:

Va urma

Așa cum am precizat de mai multe ori pe parcursul acestui articol, următorul episod se va ocupa de diferite cazuri speciale în care nu este clar care ar trebui să fie rezultatul.

 

Te-ar putea interesa și:

  • gpanther

    Important de mentionat:

    - de obicei e de preferat sa folosim double in loc de float (ca registrii / alignmentul e oricum pe 64 de biti) in majoritatea cazurilor.

    - exista si Double.MIN_VALUE (respectiv MIN_NORMAL dar cred ca inca n-ai vorbit despre FP normalizat / denormalizat), dar care nu este "cea ma mica valoare reprezentabila" (cum este de exemplu Long.MIN_VALUE) ci "valoarea cea mai aproape de zero reprezentabila". Daca vrei echivalentul de la Long.MIN_VALUE trebuie sa faci -Double.MAX_VALUE.

    • Mihai Scorţaru

      Am preferat Float în loc de Double fiindcă apar destul de des reprezentările pe biți și cele mai lungi de la Double ar fi fost mai greu de urmărit.

      Am vrut să menționez în treacăt și MIN_VALUE, dar nu i-am găsit locul. Poate ar fi potrivit în episodul trecut, la comparațiile cu 0. -Float.MAX_VALUE apare în acest articol.

      Legat de normalizare, nu intenționam să mă ocup de ea în această serie fiindcă ideea de bază era doar prezentarea numerelor speciale. Totuși, poate ar merita și ea un episod...