Číselné soustavy, velikosti v bajtech a jednotky, o které se lidé přou

Jak hexadecimální zápis odpovídá bitům, proč se disk s 1 TB hlásí jako 931 GB, kolik doopravdy dělá 0,1 plus 0,2 a jak zaokrouhlování, procenta a formátování podle lokalizace tiše mění číslo.

Zapsané číslo nese dvě věci: hodnotu a sadu předpokladů o tom, jak se má číst. 0xFF, 255, 0o377 a 11111111 je jedna veličina ve čtyřech zápisech. Terabajt a tebibajt se liší o deset procent. 1,234 je v Londýně zhruba tisíc a v Berlíně zhruba jedna. Většina chyb s čísly pochází z těch předpokladů, ne z aritmetiky.

Dvojková, osmičková, desítková a šestnáctková soustava

Každá poziční soustava funguje stejně. Každý řád má hodnotu základu krát řád napravo od něj a číslice jdou od nuly do základu minus jedna. Soustava o základu 16 potřebuje šest číslic navíc, takže si pro deset až patnáct půjčuje AF.

Šestnáctková soustava se pro bajty a barvy používá proto, že 16 je 2 na čtvrtou, takže jedna hexadecimální číslice je přesně čtyři bity a jeden bajt jsou přesně dvě hexadecimální číslice, mezi nimiž se nic nepřenáší.

0 0000   4 0100   8 1000   C 1100
1 0001   5 0101   9 1001   D 1101
2 0010   6 0110   A 1010   E 1110
3 0011   7 0111   B 1011   F 1111

Ta tabulka je celý převod. Ze šestnáctkové do dvojkové nahradíte každou číslici jejími čtyřmi bity: z 0x2F se stane 0010 1111. Zpátky bity seskupíte po čtyřech zprava, zleva doplníte nulami a každou skupinu z tabulky přečtete.

Pro desítkovou soustavu použijte hodnoty řádů. 0x2F je 2 x 16 + 15, což je 47. Opačným směrem opakovaně dělte šestnácti a zbytky čtěte odspodu nahoru:

200 / 16 = 12 remainder 8   -> 8
 12 / 16 =  0 remainder 12  -> C
200 decimal = 0xC8

Osmičková soustava balí do jedné číslice tři bity, a proto se unixová oprávnění píší jako 755: každá číslice je jedna trojice rwx, kde 7 je 111 a 5 je 101. Barva v CSS jako #FF8800 jsou tři bajty, jeden na kanál, každý v rozsahu 0 až 255, a třímístná zkratka #F80 se rozvine zdvojením každé číslice, ne doplněním nulami. Number Base Converter pokrývá všechny čtyři soustavy naráz.

Dvojkový doplněk a odkud se berou rozsahy

Bajt drží 256 různých vzorů. Čtené bez znaménka jsou to hodnoty 0 až 255. Čtené se znaménkem označuje nejvyšší bit zápornou polovinu a záporná hodnota je její vzor minus 256. Tomuto schématu se říká dvojkový doplněk a bylo zvoleno proto, že obyčejné binární sčítání pak funguje na hodnotách se znaménkem i bez něj stejně.

Číslo znegujete tak, že invertujete každý bit a přičtete jedničku. Rozsah je nesymetrický, protože nula zabírá jedno ze 128 míst v nezáporné polovině, takže bajt se znaménkem jde od -128 do 127. Přičtení jedničky k hornímu konci rozsahu přeteče na dolní:

  0111 1111    127
+ 0000 0001      1
= 1000 0000   -128

Ve většině jazyků se nic neohlásí; hodnota se prostě objeví na druhé straně rozsahu. Totéž přetečení na 32 bitech je problém roku 2038, kde 32bitové unixové časové razítko se znaménkem dojde na 2 147 483 647 sekundách. Bez znaménka dá 16 bitů rozsah 0 až 65 535, což je přesně důvod, proč tam čísla TCP portů končí a proč Random Port Generator losuje z tohoto rozsahu a vyhýbá se vyhrazeným portům pod 1024.

Kilobajty, kibibajty a chybějící gigabajty

Výrobci úložišť počítají v mocninách deseti. Operační systémy historicky počítaly v mocninách dvou a výsledek označovaly desítkovou předponou, a tím spor začíná. Binární předpony (KiB, MiB, GiB) existují proto, aby tuto nejednoznačnost odstranily.

Mocnina desetiDesítková hodnotaBinární předponaBinární hodnotaRozdíl
kB, 10^31 000KiB, 2^101 0242,4 %
MB, 10^61 000 000MiB, 2^201 048 5764,9 %
GB, 10^91 000 000 000GiB, 2^301 073 741 8247,4 %
TB, 10^121 000 000 000 000TiB, 2^401 099 511 627 77610,0 %
PB, 10^1510^15PiB, 2^501 125 899 906 842 62412,6 %

Disk s 1 TB drží tak, jak se prodává, 10^12 bajtů. Vydělte to 2^30 a dostanete 931,32, takže Windows hlásí asi 931 GB, přičemž pro binární veličinu používají desítkové označení. Nic nechybí; tytéž bajty se jen dělí jiným číslem. macOS a většina linuxových nástrojů dnes hlásí desítkové GB, což odpovídá krabici. Velikosti paměti jsou skutečně binární, takže 16 GB RAM opravdu je 16 GiB.

Rychlosti sítě se počítají v bitech, ne v bajtech, a vždy desítkově. Linka se 100 Mbps přenese 100 000 000 bitů za sekundu, což je před režií 12,5 MB za sekundu. Režie protokolu si vezme pár procent, takže reálným stropem je 11 až 12 MB za sekundu. Rychlá kontrola je vydělit inzerovaný údaj v megabitech osmi a Unit Converter pokrývá jednotky úložiště.

Plovoucí řádová čárka a proč peníze nejsou float

Binární zlomky dokážou vyjádřit jen součty polovin, čtvrtin, osmin a tak dál. Jedna desetina nemá přesný binární tvar, stejně jako jedna třetina nemá přesný desítkový tvar, takže 0.1 uložená jako double podle IEEE 754 je o kousek víc než desetina. Sečtěte dvě takové aproximace a chyba vypluje na povrch:

0.1 + 0.2 = 0.30000000000000004

Double má 53 bitů mantisy. Díky tomu je přesně vyjádřitelné každé celé číslo do 2^53 (9 007 199 254 740 992) a každý zlomek, jehož jmenovatel je mocninou dvou. Nad 2^53 je mezera mezi vyjádřitelnými hodnotami 2, takže 2^53 + 1 se rovná 2^53. Právě proto by 64bitové databázové identifikátory posílané přes JSON měly cestovat jako řetězce: čísla v JavaScriptu jsou doubly a 19místné ID tiše přijde o poslední číslice.

U peněz ukládejte celočíselné drobné jednotky (haléře, centy), nebo použijte desítkový typ, který počítá v desítkové soustavě. Nikdy neporovnávejte floaty na rovnost; porovnávejte rozdíl proti malé toleranci. Expression Calculator také počítá v doublech a dědí tytéž limity.

Zaokrouhlování a zaokrouhlování dvakrát

Zaokrouhlování půlky nahoru posílá rovnovážný případ směrem od nuly. Zaokrouhlování půlky na sudou, kterému se také říká bankovní zaokrouhlování, posílá rovnovážný případ na nejbližší sudou číslici, čímž odstraňuje vychýlení nahoru, jaké zaokrouhlování půlky nahoru zanáší do dlouhého sloupce čísel. Je to výchozí režim IEEE 754 a pravidlo v několika účetních standardech.

HodnotaPůlka nahoruPůlka na sudou
0,510
1,522
2,532
3,544
-0,5-10

Zaokrouhlujte jednou, z původní hodnoty. Zaokrouhlení 2,4449 na tři desetinná místa dá 2,445 a zaokrouhlení téhle hodnoty na dvě dá 2,45, zatímco zaokrouhlení originálu rovnou na dvě dá 2,44. Řetězené zaokrouhlování přes mezisloupce je běžnou příčinou součtů, které se liší o haléř. Související překvapení: 2,675 se ve většině jazyků zaokrouhlí na 2,67, protože uložený double je 2,67499999999999982.

Procento a procentní bod

Sazba, která se posune ze 4 % na 5 %, vzrostla o jeden procentní bod, nebo relativně o 25 %. Obojí je správně a jednotku je nutné uvést.

Procentní změny se navzájem neruší. Po poklesu o 50 % a následném růstu o 50 % zbude 75, ne 100, protože se druhé procento počítá z menšího základu. Vyrovnat pokles o p vyžaduje růst o p / (1 - p), takže pokles o 50 % potřebuje 100 % a pokles o 80 % potřebuje 400 %. Po sobě jdoucí změny se násobí, čímž vzniká geometrická posloupnost, ne součet, a přesně takový růst nástroj Number Sequence modeluje.

Změna ze staré hodnoty na novou je (new - old) / old x 100, což Percentage Calculator hlásí jako rozdíl. Odstranit 20% DPH znamená dělit 1,2, ne odečíst 20 %. Průměrování procent přes skupiny různých velikostí dá špatné celkové číslo, pokud není průměr vážený, a nástroj Sum and Average, který vedle průměru zobrazuje medián, to zkreslení zviditelní.

Čísla formátovaná podle lokalizace

Formátování je rozhodnutí o zobrazení a bez znalosti lokalizace se nedá vrátit zpět. 1.234 je ve Spojeném království jedna a něco a v Německu tisíc. 1,234 je to naopak. Některé lokalizace místo toho oddělují skupiny mezerou nebo apostrofem.

Lokalizace1234567.89
en-GB, en-US1,234,567.89
de-DE1.234.567,89
fr-FR1 234 567,89
de-CH1'234'567.89
en-IN12,34,567.89

Indické seskupování klade první oddělovač po třech číslicích a dál po každých dvou, čímž vznikají lakh a crore místo tisíců a milionů. Parsování naformátovaného řetězce zpátky na číslo je přesně z tohoto důvodu ztrátové, takže hodnoty ukládejte a přenášejte neformátované s tečkou jako desetinným oddělovačem a formátujte je až ve chvíli zobrazení. Tam, kde musí být číslo pro čtenáře jednoznačné, je obvyklým postupem na šecích a ve smlouvách vypsat ho slovy pomocí Number to Words. Římské číslice stojí mimo tohle všechno: bez hodnoty řádu a bez nuly pracuje Roman Numeral Converter spíš s čárkováním než se soustavou.