sistema posizionale
due modi:
posizionale, decimale
0,341=tre decimi più quattro centesimi più un millesimo
cifre dopo la virgola:
potenze di dieci
decimi, centesimi, millesimi, ecc.
sono le potenze di dieci:
numero frazionario: regola
numeri come 0,23 o come 0,00932
in generale, 0,cifre
0,c1c2c3… = c1×10-1 + c2×10-2 + c3×10-3 + …
numero frazionario: base b
al solito: b al posto di 10
0,c1c2c3… = c1×b-1 + c2×b-2 + c3×b-3 + …
conversione in decimale: si calcola questa somma
conversione in decimale
numero ottale 0,645 vale:
0,645 = 6×8-1 + 4×8-2 + 5×8-3 = 6/8 + 4/(8×8) + 5/(8×8×8) = 0,822265625
da binario a decimale
numero binario 0,110101
in decimale:
0,110101 = 1×2-1 + 1×2-2 + 0×2-3 + 1×2-4 + 0×2-5 + 1×2-6 = 1/2 + 1/4 + 0/8 + 1/16 + 0/32 + 1/64 = 0,828125
casi particolari di conversione
conversione da una base all'altra
se una delle due è potenza dell'altra:
si raggruppano i bit
es: tre bit = una cifra ottale
è come per il caso intero
da decimale ad altra base
metodo simile alle divisioni successive
ma con moltiplicazioni successive
per convertire in base b:
conversione in binario: esempio
numero decimale 0,6875
valore binario: parti intere nell'ordine
non nell'ordine opposto!
risultato: 0,1011
quando ci si ferma?
quando rimane zero
può non succedere mai:
di nuovo 0,2
si ricomincia da capo
numero infinito di cifre
conversione da base 10=2×5 a 2
nel 10 c'è il 2
nel 2 non c'è il 5
in questo caso: 0,2=1/5
quindi…
conversione infinita
10=2×5
0,2: infinite cifre binarie
0,375: quattro cifre binarie
esercizio
convertire 0,78125 in binario
soluzione
moltiplicazioni successive per due
ogni volta si elimina la parte intera
parti intere nell'ordine 0,11001
non ordine inverso
conversione parte intera:
⇒ resti in ordine inverso
conversione parte frazionaria:
⇒ parti intere nell'ordine
esempio
convertire 0,1875 in binario
risultato: 0,0011.
esercizio
convertire 0,640625 in ottale
soluzione
moltiplicazioni successive
questa volta si moltiplica per otto
numero in ottale: 0,51
perchè funziona?
numero n
in base b: una sequenza di cifre 0,c1c2c3…
tale che:
n = c1×b-1 + c2×b-2 + c3×b-3 + …
si moltiplica tutto per la base (segue)
moltiplicazione per la base
n = c1×b-1 + c2×b-2 + c3×b-3 + …
moltiplicato b:
n×b = c1×b0 + c2×b-1 + c3×b-2 + … =
= c1 + 0,c2c3…
ultimo passaggio: definizione del numero
0,c2c3…
(era:
0,c2c3…
indica
c2×b-1 +
c3×b-2 +
…)
parte intera e frazionaria
n×b = c1 + 0,c2c3…
parte intera di n×b: prima cifra
parte frazionaria: 0,c2c3…
si può ripetere il procedimento
si moltiplica per b, ecc.
numeri con parte intera e frazionaria
si convertono separatamente le due parti
in generale, in base b:
ck…c0,c-1c-2… =
ck×bk + … + c0×b0 + c-1×b-1 + c-2×b-2 + … =
∑i=k,k-1,… ck×bk
esercizio
convertire 12,6875 in binario
soluzione
si converte la parte intera
si converte la parte frazionaria
soluzione: parte intera
12,6875
divisioni successive su 12
parte intera del risultato: 1100
(resti in ordine inverso)
soluzione: parte frazionaria
12,6875
moltiplicazioni successive su 0,6875
parti intere nell'ordine: 0,1011
(nell'ordine, non in ordine inverso)
soluzione: risultato
parte intera - virgola - parte frazionaria:
1100,1011
numero prefissato di bit
es: 64
impossibile rappresentare:
virgola fissa
dei 64 bit:
oppure: 32 e 32
si dice virgola fissa
numeri rappresentabili
massimo numero rappresentabile:
281474976710655,9999847412109375
(duecentoottantunomilaquattrocentosettantaquattro miliardi, ecc.)
minimo numero positivo rappresentabile:
0,0000152587890625
non sempre bastano
servono anche per i risultati intermedi dei calcoli
massimo e numero prima
in decimale:
281474976710655,9999847412109375 281474976710655,999969482421875
ha senso distinguerli?
granularità della virgola fissa
281474976710655,9999847412109375 281474976710655,999969482421875
numeri dell'ordine dei centomila miliardi
differiscono per la quinta cifra dopo la virgola
nella maggior parte delle applicazioni si possono considerare uguali
virgola mobile
rappresenta numeri più grandi e più piccoli
rinuncia alla precisione su numeri grandi
virgola mobile: principio
sempre numero prefissato di bit complessivi (es. 64)
ma:
la posizione della virgola fa parte della rappresentazione del numero
virgola mobile: composizione
un numero si rappresenta come:
esempi
perchè "esponente"?
351#0=0,351 1023#1=1,023 1023#2=10,23 21#5=21000,0 7214#-3=0,0007214
numero = 0,mantissa × 10esponente
351#0 = 0,351 × 100 = 0,351 1023#1 = 0,1023 × 101 = 1,023 1023#2 = 0,1023 × 102 = 10,23 21#5 = 0,21 × 105 = 21000 7214#-3 = 0,7214 × 10-3 = 0,0007214
base generica
base b
numero n rappresentato come:
n = m × be
dove m=0,cifre
non è una limitazione:
m=10 e e=4 → m=0,1 e e=6
granularità
virgola fissa: numeri rappresentati in forma esatta
(se il numero di cifre è sufficiente)
virgola mobile: le ultime cifre si possono perdere
virgola mobile, con molte cifre
se disponibili solo sei cifre per la mantissa:
(ultimi due uguali)
perdita di granularità
ultimi due uguali
ma già molto simili in partenza
virgola mobile e virgola fissa
otto cifre totali
vigola mobile (sei cifre di mantissa+due di esponente):
100000000100 e 100000000200 uguali
virgola fissa (otto cifre totali):
100000000100 e 100000000200 non si possono rappresentare
virgola mobile: principio
si rappresenta la "parte principale" di un numero
(nell'esempio: le prime sei cifre)
si trascura quello che segue
(se non basta lo spazio)
esercizio
mantissa 0,5235 ed esponente -2
quanto vale?
soluzione
dalla definizione:
numero = mantissa × besponente
in questo caso:
0,5235×10-2 = 0,5235/100=0,005235
oppure, spostando la virgola:
5235#-2 = 0,5235 = 0,005235
←←
esercizio
numero decimale 34576,12
come si rappresenta in virgola mobile?
quattro cifre decimali di mantissa e una di esponente
soluzione
si porta il numero nella forma 0,cifre
34576,12 = 0,3457612 × 105
mantissa 0,3457
(solo quattro cifre disponibili!)
esponente 5
quanto vale?
valutazione del risultato
numero da rappresentare: 34576,12
in virgola mobile: 0,3457 e 5
0,3457 × 105 = 0,3457 × 10000 = 34570
non solo non ci sono le cifre dopo la virgola
si è persa anche l'ultima cifra intera
esercizio
convertire il numero decimale 0,000123119
virgola mobile
quattro cifre di mantissa e una di esponente
soluzione
0,000123119 = 0,123119 × 10-3
mantissa (quattro cifre); 0,1231
esponente -3
esercizio
10034402341
quattro cifre di mantissa, una di esponente
10034402341 = 0,10034402341 × 1011
non basta una cifra di esponente
non si può rappresentare
per la mantissa sarebbe bastato troncare a 0,1003
numeri non rappresentabili in virgola mobile
calcoli in virgola mobile
sommare 101#3 e 2#2
non si possono sommare le mantisse: 0,101+0,2
0,101+0,2 sarebbe 101+200
ovviamente…
per sommare 101#3 e 2#2:
nemmeno 101+2 funziona
i numeri sono 101 e 20
somma in virgola mobile
calcolare i due numeri in modo esplicito: troppo oneroso
si converte il minore nell'esponente del maggiore
101#3 è 0,101×1000
2#2 è 0,2×100 = 20 = 0,02×1000
ora si può fare 0,101 + 0,02 = 0,121
risultato: 0,121×1000=121#3
somma in virgola mobile: normalizzazione
0,101 + 0,02 = 0,121
se veniva maggiore o uguale a uno?
la mantissa deve essere nella forma 0,cifre
si riporta in quella forma:
esempio
sommare 95#2 e 7#1
soluzione
risultato 102#3
esercizio
sommare 994#5 e 671#3
quattro cifre di mantissa e una di esponente
soluzione
esponente minore: 3
0,671 × 103 = 0,00671 × 105
somma mantisse 0,994 + 0,00671 = 1,00071
non è minore di uno
1,00071 × 105 = 0,100071 × 106
esponente 5 diventa 6
0,100071 ha troppe cifre
risultato: 1#6
esercizio
sommare 9561#3 e 12#4
usare solo la somma fra interi
quattro cifre di mantissa e una di esponente
soluzione
aumento esponente minore:
0,9561 × 103 = 0,09561 × 104
mantisse:
0,09561 → 0,0956 0,12 → 0,1200
si sommano come interi:
1 ← riporti 0956 + 1200 = -------- 2156
risultato 2156#4
cambio di esponente
non serve farlo in modo esplicito
0,9561 × 103 = 0,09561 × 104
ogni zero in più è un aumento di uno dell'esponente
9561#3 = 09561#4
zero davanti alla mantissa
incremento di uno dell'esponente
la somma richiede solo: aggiunte di zeri, incrementi e una somma fra interi
somma, algoritmo
per sommare a#b e c#d:
esempio
sommare 994#3 con 6169#1
quattro cifre mantissa, due esponente
risultato: 1001#4
esercizio
sommare 6002#-1 e 12#2
quattro cifre di mantissa e una di esponente
soluzione
0006001 + 1200000 = ----------- 1206001
virgola mobile, in base diversa da dieci
mantissa ed esponente sono in base b
valore:
mantissa # esponente = 0,mantissa × baseesponente
normalizzazione:
aumentare o diminuire l'esponente in modo che la 0,mantissa sia compresa fra 0,1 (incluso) e 1 (escluso)
0,1 in base b è 1/b
esempio
convertire 123,75
binario, otto bit di mantissa e quattro di esponente
parte intera
123,75
parte intera: 1111011
parte frazionaria
123,75
parte frazionaria: 0,11
numero complessivo: 1111011,11
esponente
numero 1111011.11
risultato: 11110111#0111
conversione parte frazionaria
numero 0,135
mantissa otto bit, esponente quattro
0,0010001010001…
quando fermarsi?
numero di bit disponibili
0,0010001010001…
inutile andare avanti: massimo otto bit
basta l'ottavo bit dopo il primo uno
0,0010001010001… → 10001010#-2 |------| otto bit
esponente: -2 = 1110 (complemento a due)
risultato: 10001010#1110
esercizio
numero 2,991
binario, mantissa otto bit, esponente quattro bit
parte intera
due bit: 10
parte frazionaria
basta fermarsi al sesto bit
con i due bit di parte intera: otto
10,111111
soluzione
10,111111
10111111#0010
formato IEEE 754
sistema usato in pratica
versione a 32 bit:
versione a 64 bit:
mantissa ed esponente
versione a 32 bit: eccesso 127
mantissa: perchè 1,cifre?
di solito è 0,cifre
con la prima cifra diversa da zero
in binario: unica cifra diversa da zero: uno
0,1cifre → 1,cifre
(diminuendo l'esponente di uno)
l'uno è implicito, non si rappresenta
valori particolari per l'esponente
00000000000 e 11111111111
usati per rappresentare condizioni particolari
(l'overflow, ecc.)
esempio
numero decimale 349,625
in binary64:
in binary32:
i bit del risultato
segno 0 (positivo)
esponente 10000000111
mantissa: 01011101101 seguito da quarantuno zeri
0100000001110101110110100000000000000000000000000000000000000000
aritmetica a precisione arbitraria
si rappresentano i numeri usando tutti i bit che servono
se il sistema usa 64 bit per ogni numero:
approccio alternativo
si memorizzano numeri razionali
ogni numero è una coppia
esempi:
per dividerli:
〈2,5〉 / 〈1,3〉 = 〈 2×3,5×1 〉 = 〈 6,5 〉
soliti sistemi per le operazioni
(ma la radice non produce un razionale)