0

IEEE-754 Float Visualizer

Se præcis hvordan et decimaltal gemmes som en IEEE-754 float – fortegnsbit, eksponentbits og mantissebits – og hvorfor tal som 0,1 ikke gemmes eksakt.

🔒 Behandles helt i din browser - intet, du indtaster her, bliver nogensinde uploadet.

Behandler... 0%
Normaliserer
Beregner exponent bias
Udvider mantissebits
Færdig

Resultat

Ethvert flydende tal en computer gemmer – et JavaScript-tal, en C float, en Python float – kodes på samme måde ifølge IEEE 754: ét fortegnsbit, en blok eksponentbits og en blok mantissebits (brøk). Enkelt præcision (32-bit) bruger 1 fortegnsbit, 8 eksponentbits og 23 mantissebits; dobbelt præcision (64-bit), formatet bag næsten ethvert sprogs standardtaltype, bruger 1 fortegnsbit, 11 eksponentbits og 52 mantissebits. Dette værktøj tager ethvert decimaltal du indtaster, koder det i en af de to bredder ved hjælp af browserens egen DataView/ArrayBuffer float-encoder – den samme maskineri din kode faktisk kører på – og farvelægger hver bit efter hvilket område den hører til.

Selve indkodningen følger tre trin, og dette værktøj gennemgår dem alle i stedet for blot at vise de endelige bits. Først, normalisering: tallet omskrives som 1.mantisse × 2^eksponent, med præcis ét ciffer før det binære komma (tal for små til dette får i stedet den subnormale behandling, uden implicit ledende 1). Dernæst, exponent bias: da eksponentfeltet skal gemme både positive og negative eksponenter som et usigneret tal, lægges en fast bias (127 for enkelt præcision, 1023 for dobbelt) til, før feltet skrives ud binært. Tredje, den fraktionelle mantisse udvides bit for bit med den klassiske “gang med to, tag heltalsdelen som næste bit, behold resten”-metode – gentaget indtil mantissefeltet er fyldt, hvorefter de resterende bits afgør om resultatet rundes op eller ned (round-half-to-even, IEEE-754 standarden).

Det er præcis derfor et så almindeligt tal som 0,1 ikke gemmes eksakt. Binært er 0,1 en gentagende brøk (0,0001100110011…, uendeligt), så ingen endelig mantisse kan holde den præcist – den skal afrundes et eller andet sted. Indkod 0,1 som en 32-bit float og læs bittene tilbage, og du får ikke 0,1 tilbage: du får nøjagtigt 0,100000001490116119384765625. Dobbelt præcision har 29 flere mantissebits at arbejde med, så dens afrundingsfejl er langt mindre, men den er heller ikke nul – 0,1 som en 64-bit double er nøjagtigt 0,1000000000000000055511151231257827021181583404541015625. Dette værktøj beregner den eksakte gemte værdi med stortalsaritmetik (ingen floating-point genveje), så kløften mellem det du indtastede og det hardwaren faktisk gemmer aldrig skjules eller approksimeres.

Specialværdier får eksakte, reserverede bitmønstre i stedet for en normal indkodning: nul og negativt nul har kun nuller i eksponent- og mantissebits (kun fortegnsbittet adskiller dem), ±Uendelig har kun ettaller i eksponentbittene og kun nuller i mantissen, og NaN har kun ettaller i eksponentbittene med mindst ét mantissebit sat. Alt kører lokalt i din browser – intet du indtaster uploades nogen steder – hvilket gør dette til et sikkert sted at opbygge reel intuition om floating-point fejl: hvorfor `0.1 + 0.2 !== 0.3` i næsten alle programmeringssprog, hvorfor float32-teksturer i grafikkode mister præcision som float64 ikke ville, og hvorfor finansiel kode generelt bør undgå binære flydende tal helt.