Cos'è l'aritmetica floating-point

(Pywikibot v.2)
 
m (Pywikibot v.2)
 
(Una versione intermedia di un altro utente non mostrate)
Riga 1: Riga 1:
I calcolatori usano la rappresentazione dei numeri in base 2, e usano la rappresentazione dei numeri in virgola moile normalizzata.
+
I calcolatori usano la rappresentazione dei numeri in base 2, e usano la rappresentazione dei numeri in virgola mobile normalizzata.
  
 
==Rappresentazione in virgola fissa in base 10==
 
==Rappresentazione in virgola fissa in base 10==
Considero un qualsiasi numero reale <math>\alpha \in \mathbb R</math>, allora
+
Considero un qualsiasi numero reale <math>\alpha \in \mathbb R</math>, allora<math display="block">\alpha = \mathrm{sgn} \alpha, \alpha_n \alpha_{n-1} \dots \alpha_0 \alpha_{-1} \alpha_{-2} \alpha_{-n}</math>dove <math>\alpha_k \in [0,9]</math>, <math>k \in \mathbb Z</math>, (<math>k>=0 =</math> parte intera, <math>k<0=</math> mantissa), e <math>\alpha_n \neq 0</math>.
<math display="block">\alpha = \mathrm{sgn} \alpha, \alpha_n \alpha_{n-1} \dots \alpha_0 \alpha_{-1} \alpha_{-2} \alpha_{-n}</math>
 
dove <math>\alpha_k \in [0,9]</math>, <math>k \in \mathbb Z</math>, (<math>k>=0 =</math> parte intera, <math>k<0=</math> mantissa), e <math>\alpha_n \neq 0</math>.
 
 
 
  
 
Equivalentemente, si scrive
 
Equivalentemente, si scrive
 
<math display="block">\alpha = \mathrm{sgn} \alpha (\alpha_n 10^n+\alpha_{n-1} 10^{n-1}+\dots+ \alpha_0*10^0+\alpha_{-1}*10^{-1}+\dots+\alpha_{-n}*10^{-n}+\dots)</math><math display="block">= \mathrm{sgn} \alpha*(\sum_{k=-\infty}^n \alpha_k 10^k) \quad \hbox{rappresentazione} \ast</math>
 
<math display="block">\alpha = \mathrm{sgn} \alpha (\alpha_n 10^n+\alpha_{n-1} 10^{n-1}+\dots+ \alpha_0*10^0+\alpha_{-1}*10^{-1}+\dots+\alpha_{-n}*10^{-n}+\dots)</math><math display="block">= \mathrm{sgn} \alpha*(\sum_{k=-\infty}^n \alpha_k 10^k) \quad \hbox{rappresentazione} \ast</math>
 
+
{{InizioTeorema|title=|number=1.1|anchor=Teorema1_1}}
 
 
{{InizioTeorema|titolo=|number=1.1|anchor=Teorema1_1}}
 
 
In base <math>\beta</math>, se supponiamo che non esista <math>\bar k</math> tale che <math>\forall k \le \bar k</math><math>a_k = \beta-1</math>, allora esiste unica la rappresentazione <math>\ast</math>.
 
In base <math>\beta</math>, se supponiamo che non esista <math>\bar k</math> tale che <math>\forall k \le \bar k</math><math>a_k = \beta-1</math>, allora esiste unica la rappresentazione <math>\ast</math>.
 
{{FineTeorema}}
 
{{FineTeorema}}
Riga 17: Riga 12:
  
  
{{InizioEsempio|titolo=|number=1.2|anchor=Esempio1_2}}
+
{{InizioEsempio|title=|number=1.2|anchor=Esempio1_2}}
Supponiamo di considerare
+
Supponiamo di considerare<math display="block">\alpha = 0.999999\dots</math>violando l'ipotesi del teorema. Infatti, esiste <math>\bar k = -1</math> tale che per ogni <math>k \le \bar k = -1</math>, si ha <math>a_k = a_{k-1} = \beta-1</math>.<math display="block">\alpha = \sum_{k=-\infty}^{-1} a_k \beta^k</math>con il cambio di variabile <math>s=-k</math>, e tenendo conto che <math>\alpha_k = \beta-1</math> per ogni <math>k<-1</math>,<math display="block">\alpha = \sum_{s=1}^{+\infty} (\beta-1) \beta^{-s}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{s=1}^{\infty} \beta^{-s+1}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{s=1}^{\infty} (1/\beta)^{s-1}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{k=0}^{\infty} (1/\beta)^{k}</math>e questa è la serie geometrica di ragione <math>1/\beta <1</math>, quindi<math display="block">\alpha = (\beta-1)*\beta^{-1}*\frac{1}{1-\beta^{-1}} =</math><math display="block">\alpha = (\beta-1)*\beta^{-1}*\frac{\beta}{\beta-1} = 1</math>e abbiamo trovato una rappresentazione differente del numero.
<math display="block">\alpha = 0.999999\dots</math>
 
violando l'ipotesi del teorema. Infatti, esiste <math>\bar k = -1</math> tale che per ogni <math>k \le \bar k = -1</math>, si ha <math>a_k = a_{k-1} = \beta-1</math>.
 
<math display="block">\alpha = \sum_{k=-\infty}^{-1} a_k \beta^k</math>
 
con il cambio di variabile <math>s=-k</math>, e tenendo conto che <math>\alpha_k = \beta-1</math> per ogni <math>k<-1</math>,
 
<math display="block">\alpha = \sum_{s=1}^{+\infty} (\beta-1) \beta^{-s}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{s=1}^{\infty} \beta^{-s+1}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{s=1}^{\infty} (1/\beta)^{s-1}</math><math display="block">= (\beta-1)*\beta^{-1}*\sum_{k=0}^{\infty} (1/\beta)^{k}</math>
 
e questa è la serie geometrica di ragione <math>1/\beta <1</math>, quindi
 
<math display="block">\alpha = (\beta-1)*\beta^{-1}*\frac{1}{1-\beta^{-1}} =</math><math display="block">\alpha = (\beta-1)*\beta^{-1}*\frac{\beta}{\beta-1} = 1</math>
 
e abbiamo trovato una rappresentazione differente del numero.
 
 
{{FineEsempio}}
 
{{FineEsempio}}
 
 
 
  
 
Il vantaggio della rappresentazione in virgola fissa è la semplicità. Lo svantaggio è l'''uniformità''.
 
Il vantaggio della rappresentazione in virgola fissa è la semplicità. Lo svantaggio è l'''uniformità''.
 
Fisso il numero di cifre della parte intera del numero e della sua parte decimale. I numeri che rappresento sono equispaziati (uniformità).
 
Fisso il numero di cifre della parte intera del numero e della sua parte decimale. I numeri che rappresento sono equispaziati (uniformità).
 
C'è quindi uno svantaggio se vogliamo lavorare contemporaneamente con numeri grandi e piccoli.
 
C'è quindi uno svantaggio se vogliamo lavorare contemporaneamente con numeri grandi e piccoli.
 
 
==Rappresentazione equivalente in virgola mobile==
 
==Rappresentazione equivalente in virgola mobile==
<math display="block">\alpha = \mathrm{sgn} \alpha (\sum_{k=n}^{-\infty} \alpha_k \beta^k), \quad \alpha_n \neq 0</math>
+
<math display="block">\alpha = \mathrm{sgn} \alpha (\sum_{k=n}^{-\infty} \alpha_k \beta^k), \quad \alpha_n \neq 0</math>Raccogliendo <math>\beta^{n+1}</math> ottengo:<math display="block">\alpha = \mathrm{sgn} \alpha *[\beta^{n+1}*\sum_{k=n}^{-\infty} \alpha_k \beta^{k-(n+1)}]</math>Si mette in evidenza l'ordine di grandezza del numero.
Raccogliendo <math>\beta^{n+1}</math> ottengo:
 
<math display="block">\alpha = \mathrm{sgn} \alpha *[\beta^{n+1}*\sum_{k=n}^{-\infty} \alpha_k \beta^{k-(n+1)}]</math>
 
Si mette in evidenza l'ordine di grandezza del numero.
 
Ad esempio,
 
<math display="block">-1234,56 = -10^4*0,123456</math>
 
Cambio di variabile: <math>s = k-(n+1)</math><math display="block">\alpha = \mathrm{sgn} \alpha*\beta^{n+1}*(\sum_{s=-\infty}^{-1} \alpha_{s+n+1} \beta^s)</math><math display="block">= \mathrm{sgn} \alpha*\beta^{n+1}*(\sum_{k=1}^{\infty} \alpha^{-k+n+1} \beta^{-k})</math><math display="block">= \mathrm{sgn} \alpha*(\beta^{n+1})*0.\alpha_n \alpha_{n-1} \alpha_1 \dots \alpha_0 \dots)</math>
 
e sto usando una rappresentazione in virgola mobile che mette in evidenza l'ordine di grandezza.
 
 
 
  
 +
Ad esempio,<math display="block">-1234,56 = -10^4*0,123456</math>Cambio di variabile: <math>s = k-(n+1)</math><math display="block">\alpha = \mathrm{sgn} \alpha*\beta^{n+1}*(\sum_{s=-\infty}^{-1} \alpha_{s+n+1} \beta^s)</math><math display="block">= \mathrm{sgn} \alpha*\beta^{n+1}*(\sum_{k=1}^{\infty} \alpha^{-k+n+1} \beta^{-k})</math><math display="block">= \mathrm{sgn} \alpha*(\beta^{n+1})*0.\alpha_n \alpha_{n-1} \alpha_1 \dots \alpha_0 \dots)</math>e sto usando una rappresentazione in virgola mobile che mette in evidenza l'ordine di grandezza.
  
 
Il vantaggio è che l'ordine di grandezza del numero viene messo subito in evidenza. Inoltre, se ho un numero fissato di cifre di mantissa, allora i numeri non sono più equispaziati.
 
Il vantaggio è che l'ordine di grandezza del numero viene messo subito in evidenza. Inoltre, se ho un numero fissato di cifre di mantissa, allora i numeri non sono più equispaziati.
  
==Struttura dell'insieme F dei numeri macchina==
+
==Struttura dell'insieme F dei numeri macchina==
Sono fissati <math>\beta</math>, il numero <math>t</math> di cifre di mantissa, <math>L,U</math> che rappresentano il minomo e massimo esponente della base. Allora <math>\mathcal F = \mathcal F(\beta,t,L,U)</math> è
+
Sono fissati <math>\beta</math>, il numero <math>t</math> di cifre di mantissa, <math>L,U</math> che rappresentano il minomo e massimo esponente della base. Allora <math>\mathcal F = \mathcal F(\beta,t,L,U)</math> è<math display="block">\{ x \, t.c. \, x = \mathrm{sgn} x . (\alpha_1 \dots \alpha_t) * \beta^p \}</math>dove per le cifre vale che <math>0  < \alpha_i<\beta-1</math>, e dove <math>\alpha_1 \neq 0</math> e dove <math>L < p < U</math>.
<math display="block">\{ x \, t.c. \, x = \mathrm{sgn} x . (\alpha_1 \dots \alpha_t) * \beta^p \}</math>
 
dove per le cifre vale che <math>0  < \alpha_i<\beta-1</math>, e dove <math>\alpha_1 \neq 0</math> e dove <math>L < p < U</math>.
 
 
 
  
 
Si pone <math>\alpha_1 \neq 0</math> per risparmiare cifre, perché ad esempio, invece di scrivere <math>0,001</math> si scrive <math>0,1*10^{-2}</math>.
 
Si pone <math>\alpha_1 \neq 0</math> per risparmiare cifre, perché ad esempio, invece di scrivere <math>0,001</math> si scrive <math>0,1*10^{-2}</math>.
 
 
  
 
Considero per semplicità <math>\beta=10</math>, <math>t=2</math>, <math>L=-1</math>, <math>U=1</math>.
 
Considero per semplicità <math>\beta=10</math>, <math>t=2</math>, <math>L=-1</math>, <math>U=1</math>.
Analizzo quindi la struttura di <math>F=F(10,2,-1,1)</math>.
+
Analizzo quindi la struttura di <math>F=F(10,2,-1,1)</math>.<math display="block">\{ x = (\mathrm{sgn} x.\alpha_1 \alpha_2) 10^p, \quad 0<\alpha_1\le 9, \, 0 \le \alpha_2 \le 9 \}</math>Ci si chiede qual è il più piccolo numero positivo <math>m</math> che riesco a rappresentare.<math display="block">m = 0.10 *10^{-1} = 1/100</math>mentre<math display="block">M = 0.99*10^1 = 9,9 \hbox{cifre ed esponente al valore massimo}</math>Sulla retta rappresento <math>0, m, M</math>, e i numeri prima di m e oltre M non possono essere rappresentati in <math>F</math>.<math display="block">m = 0.10*10^{-1} = 0.01</math><math display="block">x = 0.10*10^{-1}, \, x_1 = 0.11*10^{-1}, x_2 = 0.12*10^{-1} \dots, x_n = 0.20*10^{-1}</math>Calcolo la differenza tra i due numeri: chiamo ''spacing'' la differenza tra un numero <math>x</math> e il successivo, cioè, in questo caso, <math>x_i-x = 10^{-3}</math>.<br>
<math display="block">\{ x = (\mathrm{sgn} x.\alpha_1 \alpha_2) 10^p, \quad 0<\alpha_1\le 9, \, 0 \le \alpha_2 \le 9 \}</math>
 
Ci si chiede qual è il più piccolo numero positivo <math>m</math> che riesco a rappresentare.
 
<math display="block">m = 0.10 *10^{-1} = 1/100</math>
 
mentre
 
<math display="block">M = 0.99*10^1 = 9,9 \hbox{cifre ed esponente al valore massimo}</math>
 
Sulla retta rappresento <math>0, m, M</math>, e i numeri prima di m e oltre M non possono essere rappresentati in <math>F</math>.
 
<math display="block">m = 0.10*10^{-1} = 0.01</math><math display="block">x = 0.10*10^{-1}, \, x_1 = 0.11*10^{-1}, x_2 = 0.12*10^{-1} \dots, x_n = 0.20*10^{-1}</math>
 
Calcolo la differenza tra i due numeri: chiamo ''spacing'' la differenza tra un numero <math>x</math> e il successivo, cioè, in questo caso, <math>x_i-x = 10^{-3}</math>.
 
 
 
 
 
 
Lo stesso si ripete in tutti gli intervalli della forma <math>(0.01, 0.02)</math>
 
Lo stesso si ripete in tutti gli intervalli della forma <math>(0.01, 0.02)</math>
 
oppure <math>(0,02, 0,03)</math> etc.
 
oppure <math>(0,02, 0,03)</math> etc.
 
  
 
Per i numeri successivi a <math>0.1*10^0</math> si ha un cambiamento. Infatti, tra numeri del tipo
 
Per i numeri successivi a <math>0.1*10^0</math> si ha un cambiamento. Infatti, tra numeri del tipo
<math display="block">x = 0.10*10^0, \, x_1 = 0,11*10^0, \, \dots</math>
+
<math display="block">x = 0.10*10^0, \, x_1 = 0,11*10^0, \, \dots</math>Lo spacing è <math>10^{-2}</math>.<br>
Lo spacing è <math>10^{-2}</math>.
 
 
 
 
 
 
Considerando la rappresentazione in virgola mobile, si ha che quando i numeri sono piccoli sono più vicini fra loro, man mano che il loro valore assoluto aumenta i numeri si diradano.
 
Considerando la rappresentazione in virgola mobile, si ha che quando i numeri sono piccoli sono più vicini fra loro, man mano che il loro valore assoluto aumenta i numeri si diradano.
 
  
 
L'equispaziatura è uguale per valori con lo stesso ordine di grandezza.
 
L'equispaziatura è uguale per valori con lo stesso ordine di grandezza.
 
 
  
 
Consideriamo il caso generale <math>f = f(\beta,t,L,U)</math>. Allora si ha
 
Consideriamo il caso generale <math>f = f(\beta,t,L,U)</math>. Allora si ha
Riga 95: Riga 49:
 
#spacing: se pongo <math>x=0.1*\beta^{L+1}</math>, il suo successivo è <math>0.1000001*\beta^{L+1}</math>, e lo spacing è <math>\beta^{L+1-t}</math> nell'intervallo<math>(0.1*\beta^{L+1}, 0.1*\beta^{L+2}) = (\beta^{L}, \beta^{L+1})</math>.In generale, in un intervallo <math>(\beta^{p}, \beta^{p+1})</math>, pongo <math>x=0,1*\beta^{p+1}</math>, e il successivo <math>0.100001*\beta^{p+1}</math>, quindi lo spacing è  <math>x_s-x =  0.0001*\beta^{p+1} = \beta^{p+1-t}</math> nell'intervallo <math>(\beta^{p}, \beta^{p+1})</math> (''da ricordare'').
 
#spacing: se pongo <math>x=0.1*\beta^{L+1}</math>, il suo successivo è <math>0.1000001*\beta^{L+1}</math>, e lo spacing è <math>\beta^{L+1-t}</math> nell'intervallo<math>(0.1*\beta^{L+1}, 0.1*\beta^{L+2}) = (\beta^{L}, \beta^{L+1})</math>.In generale, in un intervallo <math>(\beta^{p}, \beta^{p+1})</math>, pongo <math>x=0,1*\beta^{p+1}</math>, e il successivo <math>0.100001*\beta^{p+1}</math>, quindi lo spacing è  <math>x_s-x =  0.0001*\beta^{p+1} = \beta^{p+1-t}</math> nell'intervallo <math>(\beta^{p}, \beta^{p+1})</math> (''da ricordare'').
  
 
+
{{InizioOsservazione|title=|number=1.1|anchor=Osservazione1_1}}
 
 
{{InizioOsservazione|titolo=|number=1.1|anchor=Osservazione1_1}}
 
 
Lo spacing diventa 1 quando <math>\beta^{p+1-t} = 1</math>, ovvero <math>p+1-t = 0</math>, <math>p = t-1</math>. Quindi, nell'intervallo <math>(\beta^{t-1}, \beta^t)</math> lo spacing è uguale a 1 e ci sono solo numeri interi.
 
Lo spacing diventa 1 quando <math>\beta^{p+1-t} = 1</math>, ovvero <math>p+1-t = 0</math>, <math>p = t-1</math>. Quindi, nell'intervallo <math>(\beta^{t-1}, \beta^t)</math> lo spacing è uguale a 1 e ci sono solo numeri interi.
 
{{FineOsservazione}}
 
{{FineOsservazione}}
Riga 103: Riga 55:
 
==Singola precisione==
 
==Singola precisione==
 
Per rappresentare un numero in singola precisione si hanno a disposizione 32 bit <math>=</math> 4 byte in base allo Standard i754, fissato nel 1985.
 
Per rappresentare un numero in singola precisione si hanno a disposizione 32 bit <math>=</math> 4 byte in base allo Standard i754, fissato nel 1985.
 +
In base 2, dei <math>32</math> bit, se ne usa 1 per il segno (<math>+=0</math> o <math>-=1</math>), 8 bit per l'esponente, 23 bit per la mantissa. Per evitare di utilizzare un bit per il segno dell'esponente, si considerano solo esponenti positivi.
  
 
+
In particolare,<math display="block">L = -126, U = 127</math><math>-126+127 = 1</math>
In base 2, dei <math>32</math> bit, se ne usa 1 per il segno (<math>+=0</math> o <math>-=1</math>), 8 bit per l'esponente, 23 bit per la mantissa. Per evitare di utilizzare un bit per il segno dell'esponente, si considerano solo esponenti positivi.
 
In particolare,
 
<math display="block">L = -126, U = 127</math><math>-126+127 = 1</math>
 
 
L'esponente <math>-126</math> viene rappresentato con 1, e tutti gli esponenti vengono traslati di <math>+127</math>, e l'esponente massimo viene rappresentato con <math>254</math>.
 
L'esponente <math>-126</math> viene rappresentato con 1, e tutti gli esponenti vengono traslati di <math>+127</math>, e l'esponente massimo viene rappresentato con <math>254</math>.
  
 
+
<math>-127 \mapsto 0</math> è l'esponente che viene riservato allo zero, o per i numeri denormalizzati.<math display="block">128 = 255 = 11111111</math>è riservato a infinito o al not a number (risultato di un'operazione non definita).
<math>-127 \mapsto 0</math> è l'esponente che viene riservato allo zero, o per i numeri denormalizzati.
 
<math display="block">128 = 255 = 11111111</math>
 
è riservato a infinito o al not a number (risultato di un'operazione non definita).
 
 
 
  
 
Uso 23 bit di mantissa, ma si ha un bit extra perché il primo bit è per forza uguale a 1 e non lo memorizzo.
 
Uso 23 bit di mantissa, ma si ha un bit extra perché il primo bit è per forza uguale a 1 e non lo memorizzo.
 
 
  
 
Quindi, in singola precisione, <math>t = 24, \, m=+.10*2^{-126} = 1.1755*10^{-38}, \, M=+,11111*2^{127} = 3.4028*10^{38}</math>.
 
Quindi, in singola precisione, <math>t = 24, \, m=+.10*2^{-126} = 1.1755*10^{-38}, \, M=+,11111*2^{127} = 3.4028*10^{38}</math>.
Riga 128: Riga 72:
 
#11 bit riservati all'esponente (shiftato di <math>1023</math>)
 
#11 bit riservati all'esponente (shiftato di <math>1023</math>)
 
#52 cifre riservate alla mantissa, + un bit extra, quindi <math>t=53</math>.
 
#52 cifre riservate alla mantissa, + un bit extra, quindi <math>t=53</math>.
<math display="block">m = .1*2^{-1022} = 2.251*10^{-308}, \, M = .111*2^{1023} = 1.7977*10^{308}</math>
+
<math display="block">m = .1*2^{-1022} = 2.251*10^{-308}, \, M = .111*2^{1023} = 1.7977*10^{308}</math>realmin e realmax indicano la barriera di underflow e la barriera di overflow, e nella doppia precisione ci sono 16 cifre decimali.
realmin e realmax indicano la barriera di underflow e la barriera di overflow, e nella doppia precisione ci sono 16 cifre decimali.
 

Versione attuale delle 14:44, 21 mag 2018

I calcolatori usano la rappresentazione dei numeri in base 2, e usano la rappresentazione dei numeri in virgola mobile normalizzata.

Rappresentazione in virgola fissa in base 10[modifica | modifica wikitesto]

Considero un qualsiasi numero reale , allora

dove , , ( parte intera, mantissa), e .

Equivalentemente, si scrive

Teorema 1.1

In base , se supponiamo che non esista tale che , allora esiste unica la rappresentazione .

 


Esempio 1.2

Supponiamo di considerare

violando l'ipotesi del teorema. Infatti, esiste tale che per ogni , si ha .
con il cambio di variabile , e tenendo conto che per ogni ,
e questa è la serie geometrica di ragione , quindi
e abbiamo trovato una rappresentazione differente del numero.

 

Il vantaggio della rappresentazione in virgola fissa è la semplicità. Lo svantaggio è l'uniformità. Fisso il numero di cifre della parte intera del numero e della sua parte decimale. I numeri che rappresento sono equispaziati (uniformità). C'è quindi uno svantaggio se vogliamo lavorare contemporaneamente con numeri grandi e piccoli.

Rappresentazione equivalente in virgola mobile[modifica | modifica wikitesto]

Raccogliendo ottengo:
Si mette in evidenza l'ordine di grandezza del numero.

Ad esempio,

Cambio di variabile:
e sto usando una rappresentazione in virgola mobile che mette in evidenza l'ordine di grandezza.

Il vantaggio è che l'ordine di grandezza del numero viene messo subito in evidenza. Inoltre, se ho un numero fissato di cifre di mantissa, allora i numeri non sono più equispaziati.

Struttura dell'insieme F dei numeri macchina[modifica | modifica wikitesto]

Sono fissati , il numero di cifre di mantissa, che rappresentano il minomo e massimo esponente della base. Allora è

dove per le cifre vale che , e dove e dove .

Si pone per risparmiare cifre, perché ad esempio, invece di scrivere si scrive .

Considero per semplicità , , , . Analizzo quindi la struttura di .

Ci si chiede qual è il più piccolo numero positivo che riesco a rappresentare.
mentre
Sulla retta rappresento , e i numeri prima di m e oltre M non possono essere rappresentati in .
Calcolo la differenza tra i due numeri: chiamo spacing la differenza tra un numero e il successivo, cioè, in questo caso, .
Lo stesso si ripete in tutti gli intervalli della forma oppure etc.

Per i numeri successivi a si ha un cambiamento. Infatti, tra numeri del tipo

Lo spacing è .
Considerando la rappresentazione in virgola mobile, si ha che quando i numeri sono piccoli sono più vicini fra loro, man mano che il loro valore assoluto aumenta i numeri si diradano.

L'equispaziatura è uguale per valori con lo stesso ordine di grandezza.

Consideriamo il caso generale . Allora si ha

  1. Cambio di variabile:
    e per la somma della serie geometrica:
  2. quantità di numeri positivi tra e (lo stesso vale per i negativi).Ho cifre di mantissa, e le possibilità con cui posso sceglierle sono:
    Considerando gli esponenti a disposizione:
  3. spacing: se pongo , il suo successivo è , e lo spacing è nell'intervallo.In generale, in un intervallo , pongo , e il successivo , quindi lo spacing è nell'intervallo (da ricordare).
Osservazione 1.1

Lo spacing diventa 1 quando , ovvero , . Quindi, nell'intervallo lo spacing è uguale a 1 e ci sono solo numeri interi.

 

Singola precisione[modifica | modifica wikitesto]

Per rappresentare un numero in singola precisione si hanno a disposizione 32 bit 4 byte in base allo Standard i754, fissato nel 1985. In base 2, dei bit, se ne usa 1 per il segno ( o ), 8 bit per l'esponente, 23 bit per la mantissa. Per evitare di utilizzare un bit per il segno dell'esponente, si considerano solo esponenti positivi.

In particolare,

L'esponente viene rappresentato con 1, e tutti gli esponenti vengono traslati di , e l'esponente massimo viene rappresentato con .

è l'esponente che viene riservato allo zero, o per i numeri denormalizzati.

è riservato a infinito o al not a number (risultato di un'operazione non definita).

Uso 23 bit di mantissa, ma si ha un bit extra perché il primo bit è per forza uguale a 1 e non lo memorizzo.

Quindi, in singola precisione, .

Doppia precisione[modifica | modifica wikitesto]

Ogni numero occupa bit e si utilizzano:

  1. 1 bit per il segno del numero
  2. 11 bit riservati all'esponente (shiftato di )
  3. 52 cifre riservate alla mantissa, + un bit extra, quindi .

realmin e realmax indicano la barriera di underflow e la barriera di overflow, e nella doppia precisione ci sono 16 cifre decimali.

 PrecedenteSuccessivo