Numere denormalizate

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 21 aprilie 2019; verificările necesită 38 de modificări .

Numere denormalizate ( eng.  numere denormalizate ) sau numere subnormale [1] ( eng.  numere subnormale ) - un tip de numere în virgulă mobilă , definite în standardul IEEE 754 .

Numerele sunt codificate : mantisa începe la 0, nu 1 (nici un implicit ), iar ordinea este cea mai mică posibilă. Numerele denormalizate sunt mai aproape de 0 decât cel mai mic număr normalizat reprezentabil. Mașina 0  este, de asemenea, un număr denormalizat.

Când scrieți în formate float (precizie simplă) , dublu (precizie dublă) , în câmpul de comandă se va scrie 0.

Dublul de 10 octeți (precizie extinsă) nu are numere denormalizate ca o clasă specială, deoarece are un bit de parte întreg explicit. Cu toate acestea, numerele cu cea mai mică ordine (în câmpul de ordine 0) și bitul părții întregi 0 au proprietăți similare.

Condiții preliminare pentru apariția

Pentru a economisi memorie, se folosește așa-numita unitate implicită : numerele în formă standard binară sunt scrise ca 1,mmm 2 ·2 k , iar unitatea principală nu este păstrată. În acest format, este imposibil să scrieți zero - prin urmare, mașina zero va fi neapărat un număr special. Pentru comoditate, ar trebui să aibă o comandă minimă.

Faptul că aceste numere speciale nu sunt doar zerouri, ci 0,mmm 2 −126 (într-un float de 4 octeți ) are un avantaj suplimentar: adunarea și scăderea nu vor duce la depășire (reducerea la zero a rezultatului) dacă rezultatul operației nu este un 0 exact Cu alte cuvinte, datorită introducerii numerelor denormalizate, condițiile și sunt echivalente, indiferent cât de apropiate (în mantise) și mici (în ordinea ) numerele scădem. Fără introducerea numerelor denormalizate, rezultatul unei astfel de operații ar putea fi 0, chiar dacă numerele nu sunt egale. Același lucru este valabil și pentru adunarea numerelor care sunt apropiate ca valoare absolută, dar de alt semn. Acest lucru poate fi nedorit, cum ar fi cauzarea unei erori de împărțire la zero dacă rezultatul este folosit ca divizor [2] .

În schimb, pe calculatorul MK-61 , scăderea 1,8 10 -99  - 1,2 10 -99 va da zero, deși numerele nu sunt egale.

Probleme de implementare

niste[ ce? ] procesoarele și coprocesoarele matematice funcționează cu numere denormalizate din hardware la aceeași viteză ca și cu cele normalizate. În altele, o astfel de procesare hardware nu este implementată (de exemplu, pentru a evita complicarea implementării FPU), iar valorile mici fie sunt aduse imediat la zero (vezi anti-depășire ), fie procesate în sistemul de operare. în software. A doua opțiune duce la o creștere a timpului de procesare pentru numerele denormalizate.

Numerele denormalizate au fost implementate în coprocesorul matematic Intel 8087 într-un moment în care standardul IEEE 754 era în curs de a fi scris. Acestea au fost cea mai controversată caracteristică a aplicației propuse, care a fost în cele din urmă acceptată [3] , dar această implementare a demonstrat că numerele denormalizate pot fi gestionate în hardware în practică. Unele implementări ale modulelor în virgulă mobilă nu acceptă numere denormalizate în hardware, ci le procesează în software. Deși această procesare este transparentă pentru utilizator, poate face ca calculele care generează sau primesc numere denormalizate ca intrare să dureze mult mai mult decât aceleași calcule cu numere normalizate.

Un exemplu de sistem în care formatul de reprezentare a numerelor nu a inclus numere denormalizate este ZX Spectrum .

Dezavantaje

Motivul pentru care au fost introduse numerele denormalizate face parte dintr-o problemă de calcul mai generală de găsire a sumei numerelor folosind o precizie limitată (vezi, de exemplu, algoritmul lui Kahan ). Mai mult, problema rezolvată prin introducerea numerelor denormalizate apare într-o gamă relativ restrânsă de numere - în apropierea limitei de depășire . Dar o problemă similară poate fi asociată și cu depășirea: de exemplu, dacă dorim să comparăm două numere cu semne diferite, a căror ordine este maximă, atunci condiția va fi testată cu succes și va da un rezultat negativ, iar condiția poate duce la o eroare de preaplin. Astfel, în cazul general, numerele denormalizate nu rezolvă problema rezultatului în funcție de permutarea termenilor, iar o anumită precizie este încă necesară de la programator atunci când lucrează cu aritmetică flotantă. În cazul în care programatorul trebuie să lucreze cu numere pe punctul de a depăși , pare mai potrivit să treacă la un format cu o gamă mai largă de exponenți sau să folosească măsuri speciale pentru a controla mărimea exponentului decât să se bazeze pe numere denormalizate. În plus, trebuie să rețineți că numerele denormalizate au mai puține cifre semnificative ale mantisei în comparație cu cele obișnuite pentru acest format, iar acest lucru este plin de o pierdere semnificativă de precizie.

Note

  1. Nemnyugin S. A. Note de curs pentru cursul „Introducere în informatică și sisteme de programare”, Cursul 9. Arhitectura computerului: Formate de stocare a datelor. Aritmetica masinii. P. 5 Arhivat 25 octombrie 2018 la Wayback Machine
  2. William Kahan. Procesul verbal al reuniunii IEEE 754R, 2002 (link indisponibil) . Preluat la 1 decembrie 2013. Arhivat din original la 15 octombrie 2016. (Engleză)    
  3. Un interviu cu bătrânul din virgulă flotantă . Universitatea din California, Berkeley. Consultat la 11 septembrie 2016. Arhivat din original la 25 aprilie 2016.  (Engleză)

Link -uri