Calcolo numerico/Cos'è l'aritmetica floating point

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Calcolo numerico

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

Consideriamo un qualsiasi numero reale α∈ℝ, allora

α=sgnα,αnαn−1…α0α−1α−2α−n

dove αk∈[0,9], k∈ℤ, k>=0= parte intera, k<0= mantissa), e αn≠0.

Equivalentemente, si scrive

α=sgnα(αn10n+αn−110n−1+…+α0∗100+α−1∗10−1+…+α−n∗10−n+…)

=sgnα∗(∑k=−∞nαk10k)rappresentazione∗

Teorema 1.1

In base β, se supponiamo che non esista k¯ tale che ∀k≤k¯ ak=β−1, allora esiste unica la rappresentazione ∗.

Esempio 1.2

Supponiamo di considerare

α=0.999999…

violando l'ipotesi del teorema. Infatti, esiste k¯=−1 tale che per ogni k≤k¯=−1, si ha ak=ak−1=β−1.

α=∑k=−∞−1akβk

con il cambio di variabile s=−k, e tenendo conto che αk=β−1 per ogni k<−1,

α=∑s=1+∞(β−1)β−s

=(β−1)∗β−1∗∑s=1∞β−s+1

=(β−1)∗β−1∗∑s=1∞(1/β)s−1

=(β−1)∗β−1∗∑k=0∞(1/β)k

e questa è la serie geometrica di ragione 1/β<1, quindi

α=(β−1)∗β−1∗11−β−1=

α=(β−1)∗β−1∗ββ−1=1

e abbiamo trovato una rappresentazione differente del numero.

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

Rappresentazione equivalente in virgola mobile

α=sgnα(∑k=n−∞αkβk),αn≠0

Raccogliendo βn+1 otteniamo:

α=sgnα∗[βn+1∗∑k=n−∞αkβk−(n+1)]

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

Ad esempio,

−1234,56=−104∗0,123456

Cambio di variabile: s=k−(n+1)

α=sgnα∗βn+1∗(∑s=−∞−1αs+n+1βs)

=sgnα∗βn+1∗(∑k=1∞α−k+n+1β−k)

=sgnα∗(βn+1)∗0.αnαn−1α1…α0…)

e stiamo 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 abbiamo un numero fissato di cifre di mantissa, allora i numeri non sono più equispaziati.

Struttura dell'insieme F dei numeri macchina

Sono fissati β, il numero t di cifre di mantissa, L,U che rappresentano il minimo e massimo esponente della base. Allora ℱ=ℱ(β,t,L,U) è

{xt.c.x=sgnx.(α1…αt)∗βp}

dove per le cifre vale che 0<αi<β−1, e dove α1≠0 e dove L<p<U.

Si pone α1≠0 per risparmiare cifre, perché ad esempio, invece di scrivere 0,001 si scrive 0,1∗10−2.

Consideriamo per semplicità β=10, t=2, L=−1, U=1. Analizzo quindi la struttura di F=F(10,2,−1,1).

{x=(sgnx.α1α2)10p,0<α1≤9,0≤α2≤9}

Ci si chiede qual è il più piccolo numero positivo m che si riesce a rappresentare.

m=0.10∗10−1=1/100

mentre

M=0.99∗101=9,9cifre ed esponente al valore massimo

Sulla retta rappresentiamo 0,m,M, e i numeri prima di m e oltre M non possono essere rappresentati in F.

m=0.10∗10−1=0.01

x=0.10∗10−1,x1=0.11∗10−1,x2=0.12∗10−1…,xn=0.20∗10−1

Calcolo la differenza tra i due numeri: chiamiamo spacing la differenza tra un numero x e il successivo, cioè, in questo caso, xi−x=10−3.

Lo stesso si ripete in tutti gli intervalli della forma (0.01,0.02) oppure (0,02,0,03) etc.

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

x=0.10∗100,x1=0,11∗100,…

Lo spacing è 10−2.

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 f=f(β,t,L,U). Allora si ha

1. m=0.100000000…∗βL

2. M=βU∗∑i=1t(β−1)∗β−i.

M=βU∗∑i=1t(β−1)∗β−i.

M=βU∗β−1∗∑i=1t(β−1)∗β−i+1.

Cambio di variabile: k+1=i

M=βU∗β−1∗∑k=0t−1(β−1)∗β−k.

e per la somma della serie geometrica:

M=βU∗β−1∗(β−1)∗1−β−t1−β−1.

M=βU∗(β−1)∗1−β−tβ−1.

M=βU∗(1−β−t)

3. Quantità di numeri positivi tra m e M (lo stesso vale per i negativi). Abbiamo t cifre di mantissa, e le possibilità con cui possiamo sceglierle sono:

βt−βt−1

Considerando gli esponenti a disposizione:

(U−L+1)(βt−βt−1)

4. Spacing: se poniamo x=0.1∗βL+1, il suo successivo è 0.1000001∗βL+1, e lo spacing è βL+1−t nell'intervallo (0.1∗βL+1,0.1∗βL+2)=(βL,βL+1). In generale, in un intervallo (βp,βp+1), poniamo x=0,1∗βp+1, e il successivo 0.100001∗βp+1, quindi lo spacing è xs−x=0.0001∗βp+1=βp+1−t nell'intervallo (βp,βp+1) (da ricordare).

Osservazione 1.1

Lo spacing diventa 1 quando βp+1−t=1, ovvero p+1−t=0, p=t−1. Quindi, nell'intervallo (βt−1,βt) lo spacing è uguale a 1 e ci sono solo numeri interi.

Singola precisione

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 32 bit, se ne usa 1 per il segno (+=0 o −=1), 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=−126,U=127

−126+127=1

L'esponente -126 viene rappresentato con 1, e tutti gli esponenti vengono traslati di +127, e l'esponente massimo viene rappresentato con 254.

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

128=255=11111111

è 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, t=24,m=+.10∗2−126=1.1755∗10−38,M=+,11111∗2127=3.4028∗1038.

Doppia precisione

Ogni numero occupa 64 bit e si utilizzano:

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

m=.1∗2−1022=2.251∗10−308,M=.111∗21023=1.7977∗10308

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

Template:Avanzamento