Numeri frazionari

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

massimo rappresentabile:
quarantotto uni virgola sedici uni
numero immediatamente inferiore:
zero come ultima cifra

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:

mantissa
valore, senza la virgola
esponente
posizione della virgola al suo interno

esempi

351#0
valore 351 con virgola in posizione zero, ossia 0,351
1023#1
valore 1023 con virgola in posizione uno, ossia 1,023
1023#2
valore 1023 con virgola in posizione due, ossia 10,23
21#5
valore 21 con virgola in posizione cinque, ossia 21000,0
7214#-3
valore 7214 con virgola in posizione meno tre, ossia 0,0007214

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=4m=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

aumentare l'esponente del secondo:
7169#1007169#3
uguagliare il numero di cifre:
994#3994000#3
somma fra interi:
994000 + 007169 = 1001169
normalizzare:
una cifra di troppo
esponente del risultato = 3+1=4
limitare le cifre:
mantissa del risultato = 1001

risultato: 1001#4


esercizio

sommare 6002#-1 e 12#2

quattro cifre di mantissa e una di esponente


soluzione


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

mantissa
rappresentata in modulo e segno
le cifre della mantissa sono 1,cifre
esponente
eccesso 1023; es:
4 si rappresenta come 1023+4=1027
-9 si rappresenta come 1023+(-9)=1014

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,1cifre1,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)