Î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.
1 2 3 4 |
public static void main (String[] args) { System.out.println(reprezentare(Float.POSITIVE_INFINITY)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY)); } |
Valorile afișate sunt:
1 2 |
01111111100000000000000000000000 11111111100000000000000000000000 |
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.
1 2 3 |
public static void main (String[] args) { System.out.println(reprezentare(Float.MAX_VALUE)); } |
În urma executării obținem:
1 |
01111111011111111111111111111111 |
Î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.
1 2 3 4 5 6 |
public static void main (String[] args) { System.out.println(reprezentare(1.0f / 0.0f)); System.out.println(reprezentare(-1.0f / 0.0f)); System.out.println(reprezentare(1.0f / -0.0f)); System.out.println(reprezentare(-1.0f / -0.0f)); } |
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:
1 2 3 4 |
01111111100000000000000000000000 11111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 |
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.
1 2 3 4 5 6 7 8 9 10 |
public static void main (String[] args) { System.out.println(reprezentare(Float.POSITIVE_INFINITY + 1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY - 1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY + Float.POSITIVE_INFINITY)); System.out.println(reprezentare(Float.POSITIVE_INFINITY - Float.MAX_VALUE)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY + 1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY - 1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY + Float.NEGATIVE_INFINITY)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY + Float.MAX_VALUE)); } |
Rezultatul fiecăreia dintre primele patru operații va fi +∞, iar rezultatul celorlalte va fi -∞:
1 2 3 4 5 6 7 8 |
01111111100000000000000000000000 01111111100000000000000000000000 01111111100000000000000000000000 01111111100000000000000000000000 11111111100000000000000000000000 11111111100000000000000000000000 11111111100000000000000000000000 11111111100000000000000000000000 |
Î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).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static void main (String[] args) { System.out.println(reprezentare(Float.POSITIVE_INFINITY * 1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY * -1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY / 1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY / -1)); System.out.println(reprezentare(Float.POSITIVE_INFINITY / 0f)); System.out.println(reprezentare(Float.POSITIVE_INFINITY / -0f)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY * 1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY * -1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY / 1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY / -1)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY / 0f)); System.out.println(reprezentare(Float.NEGATIVE_INFINITY / -0f)); } |
Obținem:
1 2 3 4 5 6 7 8 9 10 11 12 |
01111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 11111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 11111111100000000000000000000000 01111111100000000000000000000000 |
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:
1 2 3 4 5 6 7 |
public static void main (String[] args) { System.out.println(Float.POSITIVE_INFINITY == Float.POSITIVE_INFINITY); System.out.println(Float.NEGATIVE_INFINITY == Float.NEGATIVE_INFINITY); System.out.println(Float.NEGATIVE_INFINITY < Float.POSITIVE_INFINITY); System.out.println(Float.NEGATIVE_INFINITY < -Float.MAX_VALUE); System.out.println(Float.POSITIVE_INFINITY > Float.MAX_VALUE); } |
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.