0

Vizualizator flotant IEEE-754

Vedeți exact cum este stocat un număr zecimal ca un float IEEE-754 - biți semn, biți exponenți și biți mantise - și de ce numere precum 0,1 nu sunt stocate exact.

Buy Me a Coffee at ko-fi.com
Procesare... 0%
Normalizarea
Calcularea prejudiciului exponentului
Biți de mantisă extinse
Gata

Rezultat

Fiecare număr în virgulă mobilă stocat de un computer - un număr JavaScript, un float C, un float Python - este codificat în același mod în IEEE 754: un bit semn, un bloc de biți exponent și un bloc de biți mantise (fracție). Precizia unică (32 de biți) utilizează 1 bit semn, 8 biți exponenți și 23 biți mantise; dublă precizie (64 de biți), formatul din spatele tipului de număr implicit al aproape fiecare limbă, utilizează 1 bit semn, 11 biți exponent și 52 biți mantisa. Acest instrument ia orice număr zecimal pe care îl tastați, îl codifică în ambele lățime folosind codificatorul flotant DataView/ArrayBuffer al browserului - aceeași mașinărie pe care rulează codul dvs. - și colorează fiecare bit în funcție de regiune căreia îi aparține.

Codificarea în sine urmează trei pași, iar acest instrument îi parcurge pe toți în loc să arate doar biții finali. În primul rând, normalizarea: numărul este rescris ca 1.mantissa × 2^exponent, cu exact o cifră diferită de zero înaintea punctului binar (numerele prea mici pentru acestea primesc tratamentul subnormal, fără 1 implicit implicit). În al doilea rând, părtinirea exponentului: deoarece câmpul exponent trebuie să stocheze atât exponenți pozitivi, cât și negativi ca număr fără semn, se adaugă o părtinire fixă ​​(127 pentru precizie simplă, 1023 pentru dublă) înainte ca câmpul să fie scris în binar. În al treilea rând, mantisa fracțională este extinsă bit cu bit cu metoda clasică „înmulțire cu doi, luați partea întreagă ca bit următor, păstrați restul” - repetată până când câmpul mantisă este plin, moment în care biții rămași decid dacă rezultatul se rotunjește în sus sau în jos (rotunjind jumătate la par, implicit IEEE-754).

Acesta este motivul pentru care un număr la fel de obișnuit ca 0,1 nu este stocat exact. În binar, 0,1 este o fracție care se repetă (0,0001100110011..., pentru totdeauna), așa că nicio mantisă finită nu o poate ține cu precizie - trebuie rotunjită undeva. Codificați 0.1 ca un float de 32 de biți și citiți biții înapoi și nu primiți 0.1 înapoi: obțineți exact 0.100000001490116119384765625. Precizia dublă are încă 29 de biți de mantisă cu care să lucreze, deci eroarea sa de rotunjire este mult mai mică, dar nici nu este zero - 0,1 ca un dublu pe 64 de biți este exact 0,100000005551115123125782702118154583046 Acest instrument calculează exact acea valoare stocată cu aritmetică cu numere întregi mari (fără comenzi rapide în virgulă mobilă), astfel încât decalajul dintre ceea ce ați tastat și ceea ce păstrează de fapt hardware-ul nu este niciodată ascuns sau aproximat.

Valorile speciale obțin modele de biți exacte, rezervate, mai degrabă decât o codificare normală: zero și zero negativ au biți de exponent și mantisă cu toți zero (doar bitul semn diferă), ±Infinity are biți cu toți exponenți cu o mantisă totală, iar NaN are toți biții exponent cu cel puțin un bit mantisă setat. Totul de aici rulează local în browserul dvs. — nimic din ce scrieți nu este încărcat oriunde — ceea ce face din acesta un loc sigur pentru a construi o intuiție reală pentru erorile în virgulă mobilă: de ce `0.1 + 0.2 !== 0.3` în aproape orice limbaj de programare, de ce texturile float32 din codul grafic își pierd precizia, ceea ce float64 ar evita în general codul binar, și de ce nu ar trebui să fluture în general.