0

IEEE-754 peldošā punkta vizualizators

Redziet precīzi, kā decimālskaitlis tiek saglabāts kā IEEE-754 peldošā punkta skaitlis — zīmes bits, eksponentes biti un mantisas biti — un kāpēc tādi skaitļi kā 0,1 netiek saglabāti precīzi.

🔒 Pilnībā apstrādāts jūsu pārlūkprogrammā — nekas, ko jūs šeit ievadāt, nekad netiek augšupielādēts.

Apstrādā... 0%
Notiek normalizācija
Notiek eksponentes nobīdes aprēķināšana
Notiek mantisas bitu izvēršana
Pabeigts

Rezultāts

Katrs peldošā punkta skaitlis, ko glabā dators — JavaScript skaitlis, C float, Python float — tiek kodēts vienādi saskaņā ar IEEE 754: viens zīmes bits, eksponentes bitu bloks un mantisas (daļdaļas) bitu bloks. Vienkāršā precizitāte (32 biti) izmanto 1 zīmes bitu, 8 eksponentes bitus un 23 mantisas bitus; dubultā precizitāte (64 biti), kas ir gandrīz katras valodas noklusējuma skaitļu tipa pamatā, izmanto 1 zīmes bitu, 11 eksponentes bitus un 52 mantisas bitus. Šis rīks ņem jebkuru jūsu ievadīto decimālskaitli, kodē to izvēlētajā platumā, izmantojot pārlūkprogrammas iebūvēto DataView/ArrayBuffer peldošā punkta kodētāju — to pašu mehānismu, uz kura darbojas jūsu kods — un iekrāso katru bitu atbilstoši tam, kuram apgabalam tas pieder.

Pats kodējums izpilda trīs soļus, un šis rīks iziet cauri visiem, nevis tikai parāda gala bitus. Pirmkārt, normalizācija: skaitlis tiek pārrakstīts kā 1.mantisa × 2^eksponente, ar tieši vienu ciparu, kas nav nulle, pirms binārā punkta (pārāk maziem skaitļiem tā vietā piemēro subnormālo apstrādi, bez implicētā vadošā 1). Otrkārt, eksponentes nobīde: tā kā eksponentes laukam ir jāglabā gan pozitīvas, gan negatīvas eksponentes kā nenegatīvs skaitlis, pirms lauka ierakstīšanas bināri tiek pieskaitīta fiksēta nobīde (127 vienkāršajai precizitātei, 1023 dubultajai). Treškārt, daļveida mantisa tiek izvērsta bitu pa bitam, izmantojot klasisko “reizināt ar divi, ņemt veselo daļu kā nākamo bitu, paturēt atlikumu” metodi — to atkārto, līdz mantisas lauks ir pilns, un tad atlikušie biti nosaka, vai rezultāts tiek noapaļots uz augšu vai uz leju (apaļo uz tuvāko pāra skaitli, IEEE-754 noklusējums).

Tieši tāpēc tik parasts skaitlis kā 0,1 netiek saglabāts precīzi. Bināri 0,1 ir periodiska daļa (0,0001100110011…, bezgalīgi), tāpēc neviena galīga mantisa to nevar saglabāt precīzi — kaut kur tas ir jānoapaļo. Kodējiet 0,1 kā 32 bitu float un nolasiet bitus atpakaļ, un jūs neatgūstat 0,1: jūs iegūstat tieši 0,100000001490116119384765625. Dubultajai precizitātei ir par 29 mantisas bitiem vairāk, tāpēc tās noapaļošanas kļūda ir daudz mazāka, taču arī tā nav nulle — 0,1 kā 64 bitu double ir tieši 0,1000000000000000055511151231257827021181583404541015625. Šis rīks aprēķina šo precīzo saglabāto vērtību ar lielo veselo skaitļu aritmētiku (bez peldošā punkta īsceļiem), tāpēc atšķirība starp jūsu ievadīto un to, ko aparatūra patiešām glabā, nekad netiek slēpta vai aproksimēta.

Īpašās vērtības iegūst precīzus, rezervētus bitu modeļus, nevis parastu kodējumu: nullei un negatīvai nullei eksponentes un mantisas biti ir visi nulles (atšķiras tikai zīmes bits), ±Bezgalībai eksponentes biti ir visi vieni ar visu nulles mantisu, un NaN eksponentes biti ir visi vieni ar vismaz vienu mantisas bitu iestatītu. Viss šeit darbojas lokāli jūsu pārlūkprogrammā — nekas no ievadītā netiek augšupielādēts —, tāpēc šī ir droša vieta, kur veidot reālu intuīciju par peldošā punkta kļūdām: kāpēc `0.1 + 0.2 !== 0.3` gandrīz katrā programmēšanas valodā, kāpēc float32 tekstūras grafikas kodā zaudē precizitāti, ko float64 nezaudētu, un kāpēc finanšu kodam parasti vajadzētu pilnībā izvairīties no binārā peldošā punkta.