JavaRush /Java Blog /Random-IT /Numeri reali nella memoria del computer. Spiegazione.
Marianna
Livello 9
Москва

Numeri reali nella memoria del computer. Spiegazione.

Pubblicato nel gruppo Random-IT
Buon pomeriggio Durante lo studio della lezione "Sfumature del lavoro con i numeri reali" della prima ricerca (sezione 2. La struttura dei numeri in virgola mobile) e delle lezioni aggiuntive sull'argomento, molti devono aver incontrato molte domande su questo argomento. Inizialmente ho cercato di darmi le risposte necessarie, e ora te le propongo per aiutarti a comprenderle appieno in un ordine logico coerente. 1. Sistemi di numerazione decimale e binaria. 1.1 Il sistema dei numeri decimali è uno dei sistemi più comuni; è quello che utilizziamo per tutti i calcoli matematici non informatici a scuola, all'università, nella vita. Utilizza i numeri 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 (arabo) - 10 cifre in totale. Esiste anche una notazione romana per i numeri, che però ora non viene praticamente utilizzata. Nel sistema decimale il conteggio viene effettuato in unità, decine, centinaia, migliaia, decine di migliaia, centinaia di migliaia, milioni, ecc. - in altre parole, queste sono tutte le cifre del numero. La cifra di un numero è la posizione (luogo) della cifra nel record numerico. La cifra più bassa dei numeri naturali (e la meno significativa ) è la cifra delle unità (più a destra). Perché è il più insignificante? Perché eliminando la cifra unitaria di un numero, il numero stesso cambierà minimamente (ad esempio, i numeri 345 e 340). Successivamente, la seconda cifra è la cifra delle decine, ecc. Che cosa significa tutto questo? Prendiamo un numero intero qualsiasi nel sistema decimale e scomponiamolo in cifre . 3297 = 3*1000 + 2*100 + 9*10 + 7 Troviamo quindi che il numero 3297 contiene 3 unità della quarta cifra (cioè 3 mila), 2 unità della terza cifra (2 centinaia), 9 unità della seconda cifra (9 decine) e 7 unità della prima cifra . In altre parole, questo numero è tremiladuecentonovantasette ed è, di conseguenza, posizionale . Che dire delle cifre dei numeri frazionari (reali) ? Le cifre dei numeri frazionari (la loro parte frazionaria) si chiamano: decimi, centesimi, millesimi, decimillesimi, ecc. Più la cifra è lontana dalla virgola (dalla parte intera del numero), meno è significativa (scartandola, il valore del numero cambierà poco). Ad esempio, prendiamo qualsiasi numero frazionario presentato come decimale: 25.076 = 2*10 + 5 +0*0.1 + 7*0.01 +6*0.001 Quindi, troviamo che il numero frazionario 25.076 contiene 2 decine, 5 unità, 0 decimi , 7 centesimi e 6 millesimi. Il sistema decimale utilizza 10 cifre e multipli di 10 cifre, da qui il nome "decimale". 1.2 Il sistema numerico binario è un sistema numerico utilizzato in quasi tutti i computer moderni e altri dispositivi elettronici informatici. Per registrare i numeri, utilizza solo due cifre: 0 e 1. Per non confondere in quale sistema numerico è scritto il numero, è dotato di un indicatore in basso a destra (è la base del sistema numerico ), per esempio: 1000₁₀ 1000₂ Qui il primo numero è il familiare migliaio nel sistema decimale, e quello in basso è il numero nella rappresentazione del sistema binario ed è uguale nel sistema decimale... 8 ! Come il sistema decimale, anche il sistema binario scompone i numeri in cifre . Ogni cifra in un numero binario è chiamata bit (o cifra ). (Se qualcuno è interessato, quattro bit sono un nibble (o tetrade), 8 bit è un byte , 16 bit è una parola , 32 bit è una doppia parola ). Anche i bit (cifre) sono numerati da destra a sinistra, partendo da zero (a differenza del sistema decimale). Il bit destro meno significativo, meno significativo, ha un numero di sequenza pari a 0 . Poi viene il primo bit, il secondo , ecc., più vecchio è il bit, più significativo è (per analogia con il sistema decimale capiamo - se rimuovi le unità dal numero 1455, rimarrai con il numero 1450 - quasi uguale a quello iniziale. Ma se togli le centinaia, rimarrai con il numero 1050, che è già lontano dal valore iniziale, perché la posizione delle centinaia è molto più significativa (di ordine superiore) rispetto alla posizione delle unità ). Esempio. NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  - 2 Nella parte inferiore, i bit di questo numero binario frazionario sono numerati in rosso: in totale abbiamo 18 bit (cifre) di questo numero. Guardando al futuro, vorrei sottolineare che i numeri frazionari vengono archiviati nella memoria del computer in un modo completamente diverso : questo verrà discusso più avanti. Nel frattempo, impariamo come convertire i numeri da un sistema numerico all'altro. 2. Conversione di numeri interi e frazioni dal sistema decimale al sistema binario e viceversa. 2.1 Conversione da decimale a binario. 2.1.1 Numeri interi. Per convertire un numero decimale intero nel sistema numerico binario, è necessario dividere questo numero per 2, annotare il resto della divisione (è sempre uguale a 0 o 1, a seconda che il numero sia pari o dispari) , e dividi nuovamente il risultato della divisione per 2 , annota nuovamente il resto della divisione (0 o 1) e dividi nuovamente il risultato della seconda divisione per 2. Continua in questo modo finché il risultato della divisione non è uguale a uno. Successivamente, annotiamo tutti gli zeri e gli uno risultanti in ordine inverso , iniziando dal risultato della divisione più recente, che è sempre uguale a 1. Nota importante. Il risultato finale della divisione sequenziale di QUALSIASI INTERO per 2 finirà sempre per essere uno (1)! Se il risultato è maggiore di 1, continuiamo a dividere questo risultato per 2 finché non otteniamo uno. E il risultato della divisione per 2 può essere zero (0) solo in un caso: questa è la divisione dello zero stesso per 2. Esempio. Convertiamo il numero 145 dal sistema decimale a binario. 145/2 = 72 (resto 1 ) 72/2 = 36 (resto 0 ) 36/2 = 18 (resto 0 ) 18/2 = 9 (resto 0 ) 9/2 = 4 (resto 1 ) 4/2 = 2 (resto 0 ) 2/2 = 1 (resto 0 ) Ora “raccogliamo” il nostro numero binario in ordine inverso. Otteniamo il numero 10010001. Fatto! Sfumatura interessante 1. Convertiamo il numero 1 dal sistema decimale a quello binario. Nel sistema binario, questo numero verrà anche scritto come 1. Dopotutto, il risultato finale della divisione per 2, che dovrebbe essere uguale a 1, è già uguale al numero stesso 1. 1₁₀ = 1₂ Sfumatura interessante 2. Convertiamo il numero 0 dal sistema decimale a quello binario. Nel sistema binario, questo numero verrà scritto anche come 0. 0₁₀ = 0₂ 2.1.2 Numeri frazionari. Come convertire i numeri frazionari in binari? Per convertire una frazione decimale nel sistema numerico binario, è necessario: a) convertire l'intera parte della frazione nel sistema binario secondo l'algoritmo studiato nel paragrafo 2.1.1 b) moltiplicare la parte frazionaria della frazione per 2 , scrivere la cifra risultante del risultato PRIMA del punto decimale (sempre uguale a 0 o 1, il che è logico), quindi moltiplicare nuovamente SOLO la parte frazionaria del risultato ottenuto per 2, annotare la cifra risultante del risultato PRIMA del punto decimale (0 o 1) e così via fino alla cifra frazionaria parte del risultato della moltiplicazione diventa uguale a 0 o fino al numero di cifre decimali richiesto ( precisione richiesta ) (pari al numero di moltiplicazioni per 2). Quindi è necessario scrivere la sequenza risultante di zeri e uno scritti IN ORDINE dopo il punto che separa la parte intera e quella frazionaria del numero reale (frazionario). Esempio 1. Convertiamo il numero 2,25 (2 virgola 25 centesimi) dal sistema decimale al sistema binario. Nel sistema binario la frazione sarà pari a 10,01 . Come abbiamo ottenuto questo? Il numero è costituito da una parte intera (fino a un punto) - questo è 2 e una parte frazionaria - questo è 0,25. 1) Traslazione dell'intera parte: 2/2 = 1 (resto 0 ) L'intera parte sarà 10 . 2) Traduzione della parte frazionaria. 0,25 * 2 = 0,5 (0) 0,5 * 2 = 1,0 (1) La parte frazionaria è diventata uguale a 0 in seguito alla moltiplicazione successiva per 2. Smettiamo di moltiplicare. Ora "raccogliamo" la parte frazionaria IN ORDINE: otteniamo 0,01 nel sistema binario. 3) Aggiungi le parti intere e frazionarie: otteniamo che la frazione decimale 2.25 sarà uguale alla frazione binaria 10.01 . Esempio 2. Convertiamo il numero 0,116 dal sistema decimale al sistema binario. 0,116 * 2 = 0,232 (0) 0,232 * 2 = 0,464 (0) 0,464 * 2 = 0,928 (0) 0,928 * 2 = 1,856 (1) //scarta la parte intera di questo risultato 0,856 * 2 = 1 ,712 (1 ) //scarta l'intera parte di questo risultato 0,712 * 2 = 1 ,424 (1) //scarta l'intera parte di questo risultato 0,424 * 2 = 0,848 (0) Come possiamo vedere, la moltiplicazione continua all'infinito , la parte frazionaria del risultato non diventa uguale a 0. Quindi decidiamo che convertiremo la nostra frazione decimale in binaria con una precisione di 7 cifre decimali (bit) dopo la virgola (nella parte frazionaria). Ricordiamo ciò che abbiamo studiato sui bit insignificanti : più il bit (bit) è lontano dall'intera parte, più è facile per noi trascurarlo (spiegazione nella sezione 1 della lezione, chi ha dimenticato). Otteniamo la frazione binaria 0.0001110 con una precisione di 7 bit dopo il punto. 2.2 Conversione da binario a decimale. 2.2.1 Numeri interi. Per tradurre il tuttonumero dal sistema numerico binario a decimale, è necessario dividere questo numero in cifre (bit) e moltiplicare ciascuna cifra (bit) per il numero 2 fino a un certo grado positivo (questo grado inizia a contare da destra a sinistra dal meno significativo (bit destro) e inizia da 0 ). In altre parole, la potenza di due è uguale al numero di un dato bit (ma questa regola non scritta può essere utilizzata solo nel caso di conversione di numeri interi , poiché per i numeri frazionari la numerazione dei bit inizia nella parte frazionaria, che si traduce nel sistema decimale in modo diverso ). Successivamente è necessario sommare i prodotti risultanti. Esempio. Convertiamo il numero binario 110011 nel sistema numerico decimale. 110011₂ = 1*2⁵ + 1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2º = 32 +16 +0 + 0 + 2 + 1 = 51₁₀ Di conseguenza, otteniamo il numero 51 nella sistema binario . A titolo informativo, di seguito è riportata una tabella delle prime potenze del numero 2 . NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  - 5 ! Tieni presente che la potenza zero di un numero è sempre 1. 2.2.2 Numeri frazionari. Per convertire un numero binario frazionario (reale) in decimale , è necessario: a) convertire la sua parte intera in decimale secondo l'algoritmo del paragrafo 2.2.1 ; b) tradurre la sua parte frazionaria come segue. È necessario presentare la parte frazionaria come la somma dei prodotti di cifre per due , elevata a una certa potenza negativa (la potenza della prima cifra dopo la virgola (dopo l'intera parte della frazione) sarà uguale a -1, poiché la seconda cifra dopo la virgola sarà uguale a -2, ecc.) Risultato questo importo sarà la parte frazionaria del numero nel sistema decimale. Esempio. Convertiamo il numero 10111.01 nel sistema binario. 10111.01₂ = (1*2⁴ + 0*2³ + 0*2² + 1*2¹ + 1*2º) . (0*2ˉ¹ + 1*2ˉ²) = (16 + 0 + 4 + 2 + 1) . (0 + 0,25) = 23,25₁₀ Di conseguenza, otteniamo il numero 23,25 nel sistema di numerazione decimale. Di seguito è riportata la tabella delle prime potenze negative di 2. NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  -7 2.2.3 Formula generale per convertire i numeri da binario a decimale. Diamo una formula generale per convertire i numeri da binario a decimale (sia parti intere che frazionarie). NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  - 4 dove A è un numero nel sistema numerico binario; La base del sistema numerico è 2 (ovvero ogni bit viene moltiplicato per 2 alla potenza); N— numero di cifre intere (bit) ; m è il numero di cifre frazionarie (bit) del numero . Il primo bit della parte intera dal punto di divisione è evidenziato in rosso . Si moltiplica sempre per 2 alla potenza zero. Il bit successivo prima (a sinistra) viene moltiplicato per 2 alla prima potenza, ecc. Il primo bit della parte frazionaria dal punto di divisione è evidenziato in verde . Si moltiplica sempre per 2 alla prima potenza negativa. Il bit successivo a destra viene moltiplicato per 2 alla potenza del secondo meno, ecc. 3. Notazione scientifica: una notazione normalizzata in entrambi i sistemi. Mantissa, esponente, grado dell'esponente. 3.1 Forma esponenziale di scrittura di un numero. In precedenza, abbiamo studiato uno schema dettagliato per la registrazione dei numeri posizionali per cifra. Prendiamo il numero 0.0000000000000000000016 . Ha una voce molto lunga nella forma standard . E in forma esponenziale sarà simile a questo: 1.6 * 10ˉ²¹ Allora qual è la forma esponenziale di un numero e come rappresentare un numero in questa forma? La notazione scientifica di un numero è una rappresentazione dei numeri reali come mantissa ed esponente . Comodo per rappresentare numeri molto grandi e molto piccoli, nonché per unificarne la scrittura. N = M * pⁿ dove N è il numero da scrivere, M è la mantissa del numero, p è la base (uguale alla base del sistema numerico del numero dato), n (intero) è l'ordine (grado , può essere positivo e negativo), p elevato a n sono i numeri caratteristici (esponente, cioè base elevata a potenza (ordine)). Una sfumatura importante. Se la parte intera del numero decimale è diversa da 0 , allora l'ordine (grado) dell'esponente sarà positivo , se la parte intera è uguale a 0 , il grado dell'esponente sarà negativo . 3.2 Forma normale e normalizzata di scrittura dei numeri. La forma normale di un numero è una forma in cui la mantissa (senza tener conto del segno) si trova sul semiintervallo [0,1], cioè 0 <= M < 1. Questa forma di scrittura ha un svantaggio: alcuni numeri sono scritti in modo ambiguo (ad esempio, 0.0001 può essere scritto come 0.000001*10², 0.00001⋅10¹, 0.0001⋅10º, 0.001⋅10ˉ¹ e così via). Pertanto, un'altra forma di registrazione è diffusa (soprattutto nell'informatica): normalizzata, in cui la mantissa di un numero decimale assume valori da 1 (compreso) a 10 (escluso), cioè 1 <= M < 10 (analogamente, la mantissa di un numero binario assume valori da 1 a 2 ). In altre parole, la mantissa nel sistema decimale deve essere un numero frazionario compreso tra 1.0 (incluso) e 10 (escluso) , ovvero la parte intera della mantissa deve contenere una sola cifra e la parte frazionaria non è matematicamente limitata. Il vantaggio della forma normalizzata è che, quindi, qualsiasi numero (eccetto lo 0) viene scritto in modo unico. Lo svantaggio è che è impossibile rappresentare lo 0 in questa forma, quindi la rappresentazione dei numeri in informatica prevede un segno speciale (bit) per il numero 0. 3.3 Esempi di scrittura di numeri decimali in forma normalizzata esponenziale. Diamo un'occhiata agli esempi. Esempio 1. Scriviamo il numero decimale 1015000 (unmilionequindicimila) in forma esponenziale normalizzata. Il sistema numerico per questo numero è decimale, quindi la base sarà 10 . Selezioniamo la mantissa . Per fare ciò, immagina il numero come una frazione, la cui parte frazionaria sarà uguale a zero (poiché il numero è un numero intero): 1000000,0. Se la parte intera del numero è maggiore di 0 , sposta il punto a sinistra della sua posizione iniziale (all'interno della parte intera) finché non rimane solo una cifra nella parte intera . Dopo di ciò mettiamo un punto. Scartiamo gli zeri insignificanti (alla fine del numero). Otteniamo la mantissa del numero pari a 1.015 . Determiniamo il grado (ordine) della base del numero. Di quante posizioni a sinistra si è spostato il nostro punto che separa la parte intera da quella frazionaria? Per sei posizioni. Ciò significa che l'ordine sarà 6 . In questo caso l'ordine è positivo (abbiamo spostato il punto nella parte intera del numero diversa da 0). La voce finale in forma normalizzata: 1.015 * 10⁶ . Possiamo scrivere questo numero nella forma: 1.015E6 (dove E6 è l'esponente di un numero decimale, cioè 10 alla sesta potenza). Mettiamoci alla prova . La notazione esponenziale di un numero non è altro che il prodotto di un numero (mantissa) e di un altro numero (esponente). Cosa succede se moltiplichi 1.015 per 10⁶? 1.015*10⁶ = 1.015*1000000 = 1015000 . Giusto. Questo approccio (normalizzato) aiuta a creare un record inequivocabilenumeri in forma esponenziale, come sopra indicato. Esempio 2. Scriviamo il numero reale decimale 0,0098 in forma normalizzata. Evidenziamo la base del numero: è uguale a 10 (sistema numerico decimale). Selezioniamo la mantissa del numero: è uguale a 9,8 (la parte intera del numero è uguale a zero, il che significa che spostiamo il punto a destra sulla prima cifra significativa (compreso nell'intervallo da 1 a 9 compreso) . Determiniamo l'ordine del numero : abbiamo spostato il punto di tre posizioni, il che significa che l'ordine è 3. Positivo è negativo o negativo? Poiché abbiamo spostato il punto a destra (nella parte frazionaria del numero), il l'ordine (potenza) sarà negativo . Il record finale del numero in forma normalizzata è 9,8 * 10ˉ³ o 9,8E-3 . Controlliamo di nuovo. Moltiplica 9,8 per 10ˉ³. 9,8 * 10ˉ³ = 9,8 * 0,001 = 0,0098 . Esatto. Esempio 3. Scriviamo il numero reale decimale 3.56 in forma normalizzata. Seleziona la base del numero - è uguale a 10 (sistema di numerazione decimale). Seleziona la mantissa del numero - è uguale a... 3.56 (l'intero parte del numero è una sola cifra, non uguale a 0. Ciò significa che non è necessario spostare il punto da nessuna parte, il numero stesso sarà la mantissa.) Evidenziamo l'ordine della base: con quale numero dovrebbe essere la mantissa , uguale al numero stesso, essere moltiplicato in modo che non cambi? Per unità. Ciò significa che l'ordine sarà zero. La registrazione finale del numero in forma normalizzata è 3,56 * 10º o 3,56E0. 4. Memorizzazione dei numeri reali nella memoria del computer: float e double. 4.1 Tipi float e double. Passiamo alla sezione chiave della nostra conferenza. Come già sappiamo, in Java esistono due tipi di numeri reali: float e double . Il tipo float occupa 32 bit nella memoria del computer e può assumere valori compresi nell'intervallo [3.4E-38; 3.4E+38) (in altre parole, nell'intervallo da 3.4*10ˉ³⁸ (incluso) a 3.4 * 10³⁸ (escluso)). Sfumatura importante 1. I numeri float possono essere positivi o negativi. L'intervallo riportato sopra viene presentato per indicare i moduli dei numeri inclusi nell'intervallo float. Sfumatura importante 2. 10³⁸ è approssimativamente uguale a 2¹²⁷ , rispettivamente, 10 ˉ³⁸ è approssimativamente uguale a 2ˉ¹²⁷ . Pertanto, l'intervallo dei valori assoluti dei numeri float può essere scritto come [3.4 * 2ˉ¹²⁷; 3,4*2¹²⁷). Il tipo doppio occupa il doppio della memoria del computer:64 bit e può accettare valori decimali nell'intervallo [-1.7E+308; 1.7E+308) rispettivamente. 4.2 Forma esponenziale normalizzata dei numeri binari. Sappiamo che i numeri sono archiviati in forma binaria nella memoria del computer. Quindi, prendiamo il numero 1560.256 (tipo float) e convertiamolo nel sistema binario in forma posizionale: 11000011000.01000001100 . Potresti pensare che questo sia il modo in cui verrà archiviato nella memoria del computer. Ma non è vero! Nella memoria del computer, i tipi float e double ( veri tipi a virgola mobile ) sono memorizzati in forma normalizzata esponenziale , ma la base della potenza è 2 anziché 10. Ciò è dovuto al fatto che, come detto sopra, tutti i dati in il computer è rappresentato in forma binaria (bit ). Una certa quantità di memoria del computer viene allocata per un numero. Rappresentiamo il numero positivo 15.2 in forma esponenziale normalizzata: 1.52*10¹ . Successivamente, rappresentiamo il suo "gemello" binario 1111.00110011001 anche in notazione normalizzata esponenziale, utilizzando lo stesso algoritmo: 1) La base sarà uguale a 2 2) La mantissa sarà uguale a 1.11100110011001 3) Il grado sarà positivo e uguale a 3 (il punto viene spostato di 3 bit a sinistra) nel sistema decimale. Convertiamolo nel sistema binario: 11 . Quindi in forma normalizzata esponenziale binaria sarebbe 1.11100110011001 * 2¹¹. 4.3 Memorizzazione della forma binaria normalizzata esponenziale di un numero float nella memoria del computer. Quindi, abbiamo capito che un numero reale verrà archiviato nella memoria del computer in forma binaria normalizzata esponenziale . Come apparirà nella memoria? Prendiamo il tipo float . Il computer assegna 32 bit per ciascun numero in virgola mobile . Sono distribuiti come segue . Questa figura mostra schematicamente la memoria allocata per un numero float a 32 bit in un computer. NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  - 5 La numerazione dei bit è indicata in rosso . Il verde indica una porzione di memoria allocata (1 bit) per memorizzare il segno del numero. Il giallo indica un pezzo di memoria allocata per memorizzare la potenza spostata (ordine) della forma esponenziale del numero (8 bit). Bludenota un pezzo di memoria allocata per memorizzare la mantissa normalizzata di un numero senza un'unità implicita (23 bit). Diamo uno sguardo più da vicino. 1) Bit di segno. Il bit più significativo (il primo da sinistra) viene sempre allocato per memorizzare il segno del numero (1 se il numero è negativo e 0 se il numero è positivo). Un'eccezione può essere il numero zero : nella programmazione lo zero può essere sia negativo che positivo . 2) Poi vengono i bit del grado (ordine) dell'esponente in base 2 . Per questo vengono assegnati 8 bit. Il grado esponenziale dei numeri float , come sappiamo, può essere sia negativo (per i numeri la cui parte intera è 0, vedere il paragrafo 3.3) che positivo (per i numeri la cui parte intera è diversa da zero) e va da 2ˉ¹²⁷ a 2¹²⁷ . In teoria dovremmo allocare un bit per determinare il segno dell'esponente, come nel caso del bit del segno. Ma non è vero. Per non perdere tempo nel determinare il segno dell'esponente, i numeri float aggiungono all'esponente un offset di mezzo byte +127 (0111 1111). Pertanto, invece di un intervallo di potenze da 2ˉ¹²⁷ a 2¹²⁷, il computer memorizza un intervallo di potenze da 0 a +254 : tutti i valori di potenza sono positivi , non è necessario sprecare un byte in più sul segno. Si scopre che il valore dell'esponente viene spostato della metà rispetto al valore possibile. Ciò significa che per ottenere il valore effettivo dell'esponente è necessario sottrarre questo offset dal valore archiviato in memoria. Se il valore dell'esponente memorizzato in memoria è inferiore all'offset (+127), allora l'esponente è negativo: questo è logico. Esempio. Eseguiamo uno spostamento di grado negativo -18 . Aggiungiamo ad esso l'offset +127, otteniamo il valore del grado +108 (non dimenticare il grado 0 nel calcolo). Convertiamo il grado in forma binaria: 1101100 Ma per il grado vengono allocati 8 bit di memoria e qui otteniamo un numero di 7 bit. Al posto della cifra alta (bit) vuota e non occupata, il computer aggiunge 0. Il risultato è che questo grado verrà archiviato nella memoria del computer come 01101100 . Vediamo: +108 < +127, il che significa che il grado in realtà è negativo. Considera la seguente tabella interessante: mostra tutti i possibili valori delle potenze delle forme normalizzate dei numeri float nei sistemi binario e decimale. Come possiamo vedere, nel sistema binario +127 è esattamente la metà di un byte intero (8 bit). 3) I restanti 23 bit sono riservati alla mantissa NON LEGGERE ANCORA :))) Numeri reali nella memoria del computer.  IN SVILUPPO!!!  - undici. Ma per una mantissa binaria normalizzata, il bit più significativo (ovvero la parte intera della mantissa normalizzata) è sempre uguale a 1 (chiamato uno implicito ), poiché il numero della mantissa è compreso nell'intervallo 1<=M<2 (e si richiama anche il paragrafo 2.1.1 della lezione). L'unica eccezione è il numero 0. Non ha senso scrivere un'unità nei 23 bit assegnati e sprecare memoria, quindi il resto della mantissa (la sua parte frazionaria) viene scritto nei 23 bit assegnati. Si scopre che essenzialmente la parte significativa del numero float ha una lunghezza di 24, di cui viene memorizzato un bit in meno. Una sfumatura importante. Ricordiamo che quando si convertono i numeri frazionari decimali in numeri binari, la parte frazionaria nel sistema binario spesso risultava enorme. E abbiamo solo 32 bit per memorizzare un numero float. In questo caso, le cifre più basse e meno significative della frazione binaria (ricordate il paragrafo 2.1.2 di questa lezione) non saranno incluse nella memoria allocata e il computer le trascurerà . La precisione del numero andrà persa , ma, vedi, è minima. In altre parole, la precisione dei float frazionari è di 6-7 cifre decimali. 4.4 Memorizzazione della forma binaria esponenziale normalizzata del numero doppio nella memoria del computer. I numeri reali di tipo double vengono archiviati nella memoria del computer allo stesso modo dei numeri float, ad eccezione di alcune caratteristiche. Un numero doppio ha 64 bit nella memoria del computer. Sono così distribuiti (anche in ordine da sinistra a destra): 1) Bit di segno (vedi paragrafo 4.3). Comprendiamo che il numero di questo bit sarà 63 . 2) Laurea (ordine). Ai numeri doppi vengono assegnati 11 bit per memorizzarli . Viene effettuato anche uno spostamento di grado , ma per i numeri doppi sarà pari a +1023. 3) Mantissa (parte significativa). Ai numeri doppi vengono assegnati 52 bit (cifre) per memorizzarli. Inoltre, la parte intera esatta della mantissa ( unità implicita ) non viene archiviata in memoria . Vale anche la pena notare che la precisione dei doppi frazionari è di circa 16 cifre decimali . 4.5 Esempi di rappresentazione di un numero reale del sistema decimale nella memoria del computer. E il punto finale della nostra conferenza sarà un esempio di conversione di un numero frazionario del sistema di numeri decimali nella forma della sua memorizzazione nella memoria del computer per consolidare la comprensione dell'argomento. Esempio 1. Prendi un numero-4.25 tipo galleggiante. Presentiamolo in forma normalizzata esponenziale nel sistema di numeri binari, ricordando tutto ciò che abbiamo trattato in questa lezione. 1) Convertire la parte intera del numero in forma binaria: 4/2 = 2 (resto della divisione 0 ) 2/2 = 1 (resto della divisione 0 ) La parte intera sarà uguale a 100 nel sistema binario. 2) Converti la parte frazionaria del numero in forma binaria. 0,25*2 = 0,5 ( 0 ) 0,5*2 = 1,0 ( 1 ) La parte frazionaria sarà uguale a 0,01 nel sistema binario. 3) Quindi, -4,25₁₀ = -100,01₂ . 4) Convertiamo il numero -100.01₂ nella forma esponenziale normalizzata nel sistema numerico binario (il che significa che la base della potenza sarà 2). -100.01₂ = -1.0001 *2² Convertiamo il valore del grado dal formato decimale a binario . 2/2= 1 (resto 0 ) Il grado è 10₂. Otteniamo che il numero -4.25₁₀ nella sua forma normalizzata esponenziale binaria sarà uguale a -1.0001 * 2¹º Scriviamo come apparirà nella memoria del computer. Il bit di segno sarà 1 (numero negativo). L'offset dell'esponente è pari a 2+127 = 129₁₀ = 10000001₂ Rimuoviamo quello implicito dalla mantissa , otteniamo 0001000000000000000000000000000 ( riempiamo i bit di ordine inferiore non occupati con zeri ). Linea di fondo. 1 10000001 00010000000000000000000 - ecco come il numero -4.25 viene archiviato nella memoria del computer. Esempio 2. Convertire il numero float 0,75₁₀ in un formato di archiviazione binario nella memoria del computer. Il risultato dovrebbe essere 0 01111110 100000000000000000000000 . Grazie per l'attenzione.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION