0

IEEE-754 slankiojo kablelio vizualizatorius

Pamatykite, kaip tiksliai dešimtainis skaičius yra išsaugomas kaip IEEE-754 slankiojo kablelio skaičius – ženklo bitas, eksponentės ir mantisės bitai – ir kodėl tokie skaičiai kaip 0,1 nėra išsaugomi tiksliai.

🔒 Visiškai apdorojama jūsų naršyklėje – niekas, kurį čia įvedėte, niekada neįkeliama.

Apdorojama... 0%
Normalizuojama
Skaičiuojamas eksponentės poslinkis
Išskleidžiami mantisės bitai
Atlikta

Rezultatas

Kiekvienas kompiuteryje saugomas slankiojo kablelio skaičius – JavaScript skaičius, C float, Python float – koduojamas vienodai pagal IEEE 754 standartą: vienas ženklo bitas, eksponentės bitų blokas ir mantisės (trupmenos) bitų blokas. Viengubas tikslumas (32 bitai) naudoja 1 ženklo bitą, 8 eksponentės bitus ir 23 mantisės bitus; dvigubas tikslumas (64 bitai) – formatas, kuriuo pagrįstas beveik visų kalbų numatytasis skaičių tipas – naudoja 1 ženklo bitą, 11 eksponentės bitų ir 52 mantisės bitus. Šis įrankis priima bet kurį jūsų įvestą dešimtainį skaičių, užkoduoja jį pasirinktu pločiu, naudodamas naršyklės DataView/ArrayBuffer slankiojo kablelio koduotuvą – tą patį mechanizmą, su kuriuo realiai veikia jūsų kodas – ir nuspalvina kiekvieną bitą pagal tai, kuriai sričiai jis priklauso.

Pats kodavimas atliekamas trimis žingsniais, ir šis įrankis praeina visus juos, užuot rodęs tik galutinius bitus. Pirma, normalizavimas: skaičius perrašomas kaip 1.mantisė × 2^rodiklis, su tiksliai vienu nuo nulio besiskiriančiu skaitmeniu prieš dvejetainį kablelį (per maži skaičiai, kad tai atitiktų, apdorojami kaip subnormalūs, be numanomo pirmaujančio 1). Antra, eksponentės poslinkis: kadangi eksponentės laukas turi saugoti tiek teigiamus, tiek neigiamus rodiklius kaip neneigiamą sveikąjį skaičių, prieš išvedant lauką dvejetainiu pavidalu pridedamas fiksuotas poslinkis (127 viengubam tikslumui, 1023 dvigubam). Trečia, trupmeninė mantisė išskleidžiama bitas po bito klasikiniu metodu „padaugink iš dviejų, sveikąją dalį paimk kaip sekantį bitą, o likutį pasilik“ – kartojama tol, kol mantisės laukas užpildomas, o tuomet likę bitai nulemia, ar rezultatas apvalinamas aukštyn, ar žemyn (artimiausio lyginio link, IEEE-754 numatytoji taisyklė).

Būtent todėl toks įprastas skaičius kaip 0,1 nėra išsaugomas tiksliai. Dvejetainėje sistemoje 0,1 yra periodinė trupmena (0,0001100110011… be galo), todėl jokia baigtinė mantisė negali jo išreikšti tiksliai – jis kažkur turi būti suapvalintas. Užkoduokite 0,1 kaip 32 bitų slankiojo kablelio skaičių ir perskaitykite bitus atgal – atgal negausite 0,1: gausite tiksliai 0,100000001490116119384765625. Dvigubas tikslumas turi 29-iais mantisės bitais daugiau, todėl jo apvalinimo paklaida yra daug mažesnė, bet ji taip pat nėra nulinė – 0,1 kaip 64 bitų double yra tiksliai 0,1000000000000000055511151231257827021181583404541015625. Šis įrankis apskaičiuoja tą tikslią išsaugotą reikšmę didžiųjų sveikųjų skaičių aritmetika (be jokių slankiojo kablelio supaprastinimų), todėl atotrūkis tarp to, ką įvedėte, ir to, ką iš tikrųjų išlaiko aparatinė įranga, niekada nėra paslėptas ar aproksimuotas.

Specialiosios reikšmės gauna tikslias, rezervuotas bitų sekas, o ne įprastą kodavimą: nulis ir neigiamas nulis turi vien nulinius eksponentės ir mantisės bitus (skiriasi tik ženklo bitas), ±Begalybė turi visus vienetinius eksponentės bitus su nuliniais mantisės bitais, o NaN turi visus vienetinius eksponentės bitus ir bent vieną nustatytą mantisės bitą. Viskas čia veikia lokaliai jūsų naršyklėje – niekas iš to, ką įvedate, niekur neįkeliama – todėl tai yra saugi vieta ugdytis tikrą intuiciją apie slankiojo kablelio klaidas: kodėl beveik visose programavimo kalbose 0,1 + 0,2 !== 0,3, kodėl float32 tekstūros grafikos kode praranda tikslumą, kurio float64 neprarastų, ir kodėl finansiniams skaičiavimams skirtame kode apskritai reikėtų vengti dvejetainio slankiojo kablelio.