Basi numeriche, dimensioni in byte e le unità su cui si litiga
Un numero scritto porta con sé due cose: un valore e un insieme di presupposti su come vada letto. 0xFF, 255, 0o377 e 11111111 sono un'unica quantità in quattro notazioni. Un terabyte e un tebibyte differiscono del dieci percento. 1,234 è circa mille a Londra e circa uno a Berlino. La maggior parte dei bug sui numeri viene dai presupposti, non dall'aritmetica.
Binario, ottale, decimale ed esadecimale
Ogni base posizionale funziona allo stesso modo. Ogni posizione vale la base moltiplicata per la posizione alla sua destra, e le cifre vanno da zero alla base meno uno. La base 16 ha bisogno di sei cifre in più, quindi prende in prestito da A a F per i valori da dieci a quindici.
L'esadecimale si usa per i byte e per i colori perché 16 è 2 elevato alla quarta, quindi una cifra esadecimale è esattamente quattro bit e un byte è esattamente due cifre esadecimali, senza riporti fra l'una e l'altra.
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
Quella tabella è tutta la conversione. Per passare dall'esadecimale al binario, sostituisci ogni cifra con i suoi quattro bit: 0x2F diventa 0010 1111. Per tornare indietro, raggruppa i bit a quattro a quattro partendo da destra, riempiendo a sinistra con degli zeri, e leggi ogni gruppo sulla tabella.
Per il decimale, usa i valori posizionali. 0x2F è 2 x 16 + 15, cioè 47. Nell'altro verso, dividi ripetutamente per 16 e leggi i resti dal basso verso l'alto:
200 / 16 = 12 remainder 8 -> 8
12 / 16 = 0 remainder 12 -> C
200 decimal = 0xC8
L'ottale impacchetta tre bit per cifra, ed è il motivo per cui i permessi Unix si scrivono come 755: ogni cifra è una terna rwx, con 7 che vale 111 e 5 che vale 101. Un colore CSS come #FF8800 è fatto di tre byte, uno per canale, ciascuno da 0 a 255, e la forma abbreviata a tre cifre #F80 si espande raddoppiando ogni cifra invece che riempiendo con degli zeri. Il Convertitore di base numerica copre tutte e quattro le basi in una volta sola.
Il complemento a due, e da dove vengono gli intervalli
Un byte contiene 256 configurazioni distinte. Lette come senza segno, vanno da 0 a 255. Lette come con segno, il bit più alto marca la metà negativa, e un valore negativo è la sua configurazione meno 256. Questo schema è il complemento a due, scelto perché così la normale addizione binaria funziona in modo identico sui valori con segno e senza segno.
Per negare un numero, inverti ogni bit e aggiungi uno. L'intervallo è asimmetrico perché lo zero occupa uno dei 128 posti della metà non negativa, quindi un byte con segno va da -128 a 127. Aggiungere uno alla cima dell'intervallo fa ricominciare dal fondo:
0111 1111 127
+ 0000 0001 1
= 1000 0000 -128
Nella maggior parte dei linguaggi non viene segnalato nulla; il valore compare semplicemente dall'altra parte dell'intervallo. Lo stesso ribaltamento a 32 bit è il problema del 2038, in cui un timestamp Unix a 32 bit con segno si esaurisce a 2.147.483.647 secondi. Sedici bit senza segno danno da 0 a 65.535, che è esattamente il motivo per cui i numeri di porta TCP si fermano lì, e per cui Porte casuali pesca da quell'intervallo evitando le porte riservate sotto la 1024.
Kilobyte, kibibyte e i gigabyte che mancano
I produttori di dispositivi di archiviazione contano in potenze di dieci. I sistemi operativi storicamente hanno contato in potenze di due etichettando il risultato con il prefisso decimale, ed è da lì che nasce la discussione. I prefissi binari (KiB, MiB, GiB) esistono per togliere l'ambiguità.
| Potenza di dieci | Valore decimale | Prefisso binario | Valore binario | Scarto |
|---|---|---|---|---|
| kB, 10^3 | 1.000 | KiB, 2^10 | 1.024 | 2,4% |
| MB, 10^6 | 1.000.000 | MiB, 2^20 | 1.048.576 | 4,9% |
| GB, 10^9 | 1.000.000.000 | GiB, 2^30 | 1.073.741.824 | 7,4% |
| TB, 10^12 | 1.000.000.000.000 | TiB, 2^40 | 1.099.511.627.776 | 10,0% |
| PB, 10^15 | 10^15 | PiB, 2^50 | 1.125.899.906.842.624 | 12,6% |
Un disco da 1 TB, così come viene venduto, contiene 10^12 byte. Dividili per 2^30 e ottieni 931,32, quindi Windows riporta circa 931 GB usando l'etichetta decimale per una quantità binaria. Non manca nulla; sono gli stessi byte, divisi per un numero diverso. macOS e la maggior parte degli strumenti Linux oggi riportano GB decimali, che corrispondono a quanto c'è scritto sulla scatola. Le dimensioni della memoria sono davvero binarie, quindi 16 GB di RAM sono davvero 16 GiB.
Le velocità di rete si contano in bit, non in byte, e sempre in decimale. Una linea da 100 Mbps trasporta 100.000.000 di bit al secondo, cioè 12,5 MB al secondo prima dell'overhead. L'overhead di protocollo si prende qualche punto percentuale, quindi da 11 a 12 MB al secondo è il tetto realistico. Dividere per otto un valore in megabit pubblicizzato è la verifica rapida, e il Convertitore di unità copre le unità di archiviazione.
Virgola mobile, e perché il denaro non è un float
Le frazioni binarie possono rappresentare solo somme di metà, quarti, ottavi e così via. Un decimo non ha una forma binaria esatta, allo stesso modo in cui un terzo non ha una forma decimale esatta, quindi 0.1 memorizzato come double IEEE 754 è leggermente più di un decimo. Somma due approssimazioni di questo tipo e l'errore viene a galla:
0.1 + 0.2 = 0.30000000000000004
Un double ha 53 bit di mantissa. Questo rende esattamente rappresentabile ogni intero fino a 2^53 (9.007.199.254.740.992), insieme a ogni frazione il cui denominatore sia una potenza di due. Sopra 2^53 la distanza fra due valori rappresentabili diventa 2, quindi 2^53 + 1 è uguale a 2^53. È per questo che gli identificatori di database a 64 bit inviati via JSON dovrebbero viaggiare come stringhe: i numeri JavaScript sono double, e un ID di 19 cifre perde in silenzio le ultime.
Per il denaro, memorizza le sottounità come interi (i centesimi) oppure usa un tipo decimale che lavori in base dieci. Non confrontare mai i float con l'uguaglianza; confronta la differenza con una piccola tolleranza. Anche la Calcolatrice di espressioni lavora in double, ed eredita gli stessi limiti.
Arrotondare, e arrotondare due volte
L'arrotondamento commerciale, o half up, porta un caso di parità lontano dallo zero. L'arrotondamento bancario, o half even, manda un caso di parità alla cifra pari più vicina, il che elimina la distorsione verso l'alto che il primo introduce lungo una colonna lunga di cifre. È il comportamento predefinito di IEEE 754 e la regola prevista da diversi standard contabili.
| Valore | Commerciale | Bancario |
|---|---|---|
| 0,5 | 1 | 0 |
| 1,5 | 2 | 2 |
| 2,5 | 3 | 2 |
| 3,5 | 4 | 4 |
| -0,5 | -1 | 0 |
Arrotonda una volta sola, a partire dal valore originale. Arrotondare 2,4449 a tre cifre decimali dà 2,445, e arrotondare quel risultato a due dà 2,45, mentre arrotondare l'originale direttamente a due dà 2,44. L'arrotondamento a catena attraverso colonne intermedie è una causa frequente di totali sbagliati di un centesimo. Una sorpresa collegata: nella maggior parte dei linguaggi 2,675 si arrotonda a 2,67, perché il double memorizzato è 2,67499999999999982.
Percentuale e punto percentuale
Un tasso che passa dal 4% al 5% è salito di un punto percentuale, oppure del 25% in termini relativi. Sono corrette entrambe le letture, e l'unità va dichiarata.
Le variazioni percentuali non si annullano. Un calo del 50% seguito da un aumento del 50% lascia 75, non 100, perché la seconda percentuale si calcola su una base più piccola. Recuperare un calo di p richiede un aumento di p / (1 - p), quindi un calo del 50% ha bisogno del 100%, e uno dell'80% del 400%. Le variazioni successive si moltiplicano, formando una successione geometrica invece di una somma, ed è la crescita che modella lo strumento Successione numerica.
La variazione da un vecchio valore a uno nuovo è (new - old) / old x 100, che è quello che la Calcolatrice percentuale riporta come differenza. Togliere il 20% di IVA significa dividere per 1,2, non sottrarre il 20%. Fare la media di percentuali su gruppi di dimensioni diverse dà un valore complessivo sbagliato, a meno che la media non sia ponderata, e Somma e media, mostrando la mediana accanto alla media, rende visibile l'asimmetria.
Numeri formattati per una locale
La formattazione è una decisione di visualizzazione, e non è reversibile senza conoscere la locale. 1.234 è poco più di uno nel Regno Unito e mille in Germania. 1,234 è il contrario. Alcune locale raggruppano invece con uno spazio o con un apostrofo.
| Locale | 1234567.89 |
|---|---|
| en-GB, en-US | 1,234,567.89 |
| de-DE | 1.234.567,89 |
| fr-FR | 1 234 567,89 |
| de-CH | 1'234'567.89 |
| en-IN | 12,34,567.89 |
Il raggruppamento indiano mette il primo separatore dopo tre cifre e poi uno ogni due cifre, dando lakh e crore invece di migliaia e milioni. Riportare una stringa formattata a un numero è un'operazione con perdita proprio per questo motivo, quindi memorizza e trasmetti i valori non formattati con il punto come separatore decimale, e formatta solo nel momento in cui li mostri. Quando un numero deve risultare inequivocabile a chi legge, scriverlo per esteso con Numero in lettere è l'approccio abituale sugli assegni e nei contratti. I numeri romani stanno fuori da tutto questo: senza valore posizionale e senza lo zero, Numeri romani ha a che fare con un sistema di conteggio, non con una base.