0

ИЕЕЕ-754 Флоат Висуализер

Погледајте тачно како се децимални број чува као ИЕЕЕ-754 флоат – бит предзнака, битови експонента и битови мантисе – и зашто се бројеви попут 0,1 не чувају тачно.

Buy Me a Coffee at ko-fi.com
Обрада... 0%
Нормализација
Рачунање пристрасности експонента
Проширујући делови мантисе
Готово

Резултат

Сваки број са помичним зарезом који рачунар чува — ЈаваСцрипт број, Ц флоат, Питхон флоат — је кодиран на исти начин према ИЕЕЕ 754: један предзначни бит, блок битова експонента и блок битова мантисе (разломак). Појединачна прецизност (32-битна) користи 1 предзнак, 8 експонентних бита и 23 бита мантисе; двострука прецизност (64-бит), формат који стоји иза подразумеваног типа броја скоро сваког језика, користи 1 знаковни бит, 11 битова експонента и 52 бита мантисе. Ова алатка узима било који децимални број који унесете, кодира га у било коју ширину користећи сопствени ДатаВиев/АрраиБуффер флоат енкодер у претраживачу — на истој машини на којој ваш код заправо ради — и боји сваки бит према региону коме припада.

Само кодирање прати три корака, а овај алат пролази кроз све њих уместо да само приказује последње битове. Прво, нормализација: број се преписује као 1.мантиса × 2^експонент, са тачно једном цифром различитом од нуле испред бинарне тачке (бројеви премали за то добијају субнормални третман, без имплицитног водећих 1). Друго, пристрасност експонента: пошто поље експонента мора да чува и позитивне и негативне експоненте као број без предзнака, фиксна пристрасност (127 за једноструку прецизност, 1023 за двоструку) се додаје пре него што се поље запише у бинарном облику. Треће, фракциона мантиса се проширује мало по мало класичним методом „помножи са два, узми цео број као следећи бит, задржи остатак“ — понавља се док се поље мантисе не попуни, у ком тренутку преостали битови одлучују да ли се резултат заокружује навише или наниже (заокружи пола на пар, подразумевано ИЕЕЕ-754).

Управо због тога број обичан као 0,1 није тачно сачуван. У бинарном смислу, 0,1 је разломак који се понавља (0,0001100110011..., заувек), тако да ниједна коначна мантиса не може да га задржи прецизно — мора се негде заокружити. Кодирајте 0.1 као 32-битни флоат и читајте битове назад, а не добијате 0.1 назад: добијате тачно 0.100000001490116119384765625. Двострука прецизност има још 29 битова мантисе за рад, тако да је њена грешка заокруживања далеко мања, али није ни нула — 0,1 као 64-битни дупликат је тачно 0,100000000000000005551115123125782702118154503. Овај алат израчунава ту тачну сачувану вредност помоћу аритметике великог целог броја (без пречица са помичним зарезом) тако да јаз између онога што сте унели и онога што хардвер заправо чува никада није сакривен или приближан.

Посебне вредности добијају тачне, резервисане шаблоне бита уместо нормалног кодирања: нула и негативна нула имају све нулте експоненте и битове мантисе (разликује се само бит знака), ±Бесконачност има све-један експонент битове са потпуно нултом мантисом, а НаН има све-један експонент битове са најмање једним постављеним битом мантисе. Све овде ради локално у вашем претраживачу — ништа што укуцате се нигде не отпрема — што ово чини безбедним местом за изградњу стварне интуиције за грешке са покретним зарезом: зашто `0.1 + 0.2 !== 0.3` у скоро сваком програмском језику, зашто флоат32 текстуре у графичком коду губе прецизност да би флоат64 флоат64 флоат бин уопште требало да избегавају у целини.