JavaRush /Java Blog /Random-IT /Cosa c'è dentro un numero in virgola mobile e come funzio...
Ivan
Livello 2
Харьков

Cosa c'è dentro un numero in virgola mobile e come funziona?

Pubblicato nel gruppo Random-IT

Contenuto:

Immagine: http://pikabu.ru/

introduzione

Nei primissimi giorni di studio di Java, mi sono imbattuto in un tipo così curioso di primitive come i numeri in virgola mobile. Mi hanno subito interessato le loro caratteristiche e, ancor di più, il modo in cui erano scritti in codice binario (che è interconnesso). A differenza di qualsiasi intervallo di numeri interi, anche in un intervallo molto piccolo (ad esempio da 1 a 2) ce n'è un numero infinito. Ed avendo una dimensione di memoria finita, è impossibile esprimere questo insieme. Allora come sono espressi in binario e come funzionano? Purtroppo, le spiegazioni sul wiki e un articolo piuttosto interessante su Habré qui non mi hanno dato una comprensione completa, sebbene abbiano gettato le basi. La realizzazione è arrivata solo dopo aver letto questo articolo di analisi la mattina dopo averlo letto.

Escursione nella storia

( tratto da questo articolo su Habré ) Negli anni 60-70, quando i computer erano grandi e i programmi piccoli, non esisteva ancora uno standard unico per i calcoli, così come uno standard per esprimere il numero in virgola mobile stesso. Ogni computer lo faceva diversamente e ognuno aveva i propri errori. Ma a metà degli anni '70, Intel decise di realizzare nuovi processori con aritmetica "migliorata" supportata e allo stesso tempo standardizzarla. Per svilupparlo furono chiamati i professori William Kahan e John Palmer (no, non l'autore di libri sulla birra). C'è stato un po' di drammaticità, ma è stato sviluppato un nuovo standard. Ora questo standard si chiama IEEE754

Formato numerico in virgola mobile

Anche nei libri di testo scolastici tutti si trovavano di fronte a un modo insolito di scrivere numeri molto grandi o molto piccoli della forma 1.2 × 10 3 o 1.2 E3 , che è uguale a 1.2 × 1000 = 1200 . Questo è chiamato metodo di notazione esponenziale. In questo caso si tratta dell'espressione di un numero mediante la formula: N=M×n p , dove
  • N = 1200 - il numero risultante
  • M = 1,2 - mantissa - parte frazionaria, senza tener conto degli ordini
  • n = 10 è la base dell'ordine. In questo caso e quando non si parla di computer, la base è il numero 10
  • p = 3 - grado di base
Molto spesso si assume che la base dell'ordine sia 10 e si scrivono solo la mantissa e il valore della base, separandoli con la lettera E. Nel nostro esempio, ho fornito voci equivalenti 1.2 × 10 3 e 1.2 E3 Se tutto è chiaro e abbiamo terminato la nostalgica escursione nel curriculum scolastico, ora consiglio di dimenticarlo, perché quando formiamo un numero in virgola mobile abbiamo a che fare con potenze di due, non decine, cioè n = 2 , l'intera formula armoniosa 1.2E3 si rompe e mi ha davvero rotto il cervello.

Segno e grado

Allora, cosa abbiamo? Di conseguenza, abbiamo anche un numero binario, che consiste in una mantissa , la parte che eleveremo a potenza e la potenza stessa. Inoltre, proprio come accade con i tipi interi, i numeri a virgola mobile hanno un bit che determina il segno, se il numero sarà positivo o negativo. Ad esempio, propongo di considerare il tipo float, che è composto da 32 bit. Con i numeri a doppia precisione doublela logica è la stessa, solo che ci sono il doppio dei bit. Dei 32 bit, il primo più significativo è assegnato al segno, i successivi 8 bit sono assegnati all'esponente - la potenza alla quale eleveremo la mantissa, e i restanti 23 bit - alla mantissa. Per dimostrarlo, diamo un'occhiata a un esempio: Cosa c'è dentro un numero in virgola mobile e come funziona - 1la prima parte è molto semplice. Se il valore del primo bit è 0 , il numero che otteniamo sarà positivo . Se il bit è 1 , il numero sarà negativo . Il blocco successivo di 8 bit è un blocco esponente. L'esponente si scrive come un normale numero di otto bit e per ottenere il grado richiesto dobbiamo sottrarre dal numero risultante 127. Nel nostro caso gli otto bit dell'esponente sono 10000001 . Ciò corrisponde al numero 129 . Se hai una domanda su come calcolarlo, l'immagine mostra una risposta rapida. Una versione ampliata può essere ottenuta in qualsiasi corso di algebra booleana. Cosa c'è dentro un numero in virgola mobile e come funziona - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 Non è difficile calcolare che il numero massimo che possiamo ottenere da questi 8 bit è 11111111 2 = 255 10 (il pedice 2 e 10 indicano i sistemi numerici binari e decimali). Tuttavia, se utilizziamo solo valori esponenti positivi ( da 0 a 255 ), quindi i numeri risultanti avranno molti numeri prima della virgola, ma non dopo? Per ottenere valori negativi del grado è necessario sottrarre 127 dall'esponente generato . Pertanto, l'intervallo di gradi sarà compreso tra -127 e 128 . Se usiamo il nostro esempio, il grado richiesto sarà 129-127 = 2 . Ricordiamo questo numero per ora.

Mantissa

Ora riguardo alla mantissa. È composto da 23 bit, ma all'inizio è sempre implicita un'altra unità, per la quale i bit non sono assegnati. Ciò viene fatto per ragioni di opportunità ed economia. Lo stesso numero può essere espresso con potenze diverse aggiungendo zeri alla mantissa prima o dopo la virgola decimale. Il modo più semplice per capirlo è con un esponente decimale: 120.000 = 1,2×10 5 = 0,12×10 6 = 0,012×10 7 = 0,0012×10 8 ecc. Tuttavia, inserendo un numero fisso nella testa della mantissa, riceveremo ogni volta nuovi numeri. Diamo per scontato che prima dei nostri 23 bit ce ne sarà uno in più con uno. Di solito questo bit è separato dal resto da un punto, che però non significa nulla. È semplicemente più conveniente 1. 111000000000000000000000 Cosa c'è dentro un numero in virgola mobile e come funziona - 3Ora la mantissa risultante deve essere elevata a una potenza da sinistra a destra, diminuendo la potenza di uno ad ogni passo. Partiamo dal valore della potenza che abbiamo ottenuto a seguito del calcolo, cioè 2 (ho scelto volutamente un esempio semplice per non scrivere ogni valore della potenza di due e non calcolarli nella tabella sopra quando il bit corrispondente è zero) Cosa c'è dentro un numero in virgola mobile e come funziona - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0,5 = 4+2+1+0,5 = 7.5 e ottenuto il risultato 7.5 , la correttezza può essere verificata, ad esempio, a questo link

Risultati

Un numero a virgola mobile standard floatè composto da 32 bit, il primo bit è il segno (+ o -), i successivi otto sono l'esponente, i successivi 23 sono la mantissa Per segno - se il bit 0 è un numero positivo. Se il bit 1 è negativo. In esponenziale : convertiamo bit per bit in un numero decimale (il primo bit da sinistra è 128 , il secondo è 64 , il terzo è 32 , il quarto è 16 , il quinto è 8 , il sesto è 4 , il settimo è 2 , l'ottavo è 1 ), sottraiamo 127 dal numero risultante , otteniamo il grado con cui inizieremo. Secondo la mantissa , ai 23 bit esistenti davanti aggiungiamo un altro bit con il valore 1 e da esso iniziamo ad elevarci alla potenza che abbiamo ricevuto, diminuendo questa potenza con ogni bit successivo. Questo è tutto ragazzi, ragazzi! Cosa c'è dentro un numero in virgola mobile e come funziona - 5PS: Come compito a casa, utilizzando questo articolo, lascia nei commenti la tua versione del motivo per cui si verificano errori di precisione con un gran numero di operazioni aritmetiche con numeri in virgola mobile
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION