NUMERI REALI - unibo.it

42
NUMERI REALI Dominio: R Un soprainsieme degli interi alcune proprietà degli interi potreb- bero non essere più verificate Un numero reale può non essere finita- mente rappresentabile come stringa di simboli in nessuna base: numeri irrazionali (p, e, ...) in alcune basi: numeri razionali periodici

Transcript of NUMERI REALI - unibo.it

Page 1: NUMERI REALI - unibo.it

NUMERI REALI

• Dominio: R

• Un soprainsieme degli interifialcune proprietà degli interi potreb-bero non essere più verificate

• Un numero reale può non essere finita-mente rappresentabile come stringa di simboli

• in nessuna base: numeri irrazionali (p, e, ...)

• in alcune basi: numeri razionali periodici

Page 2: NUMERI REALI - unibo.it

NUMERI REALI

• La rappresentazione di un numero razio-nale può risultare periodica o meno, a seconda della base adottata

• In particolare, non è mai periodica se si assume come base il denominatore della sua forma fratta

• 1/3 = (0.333333333333...)10 = (0.1)3

• 8/7 = (1.142857142857...)10 = (1.1)7

• ...

Page 3: NUMERI REALI - unibo.it

NUMERI REALI IN DIVERSE BASI• Se la rappresentazione di un numero razionale in base

B è periodica, è periodica anche la rappresentazione in

base B’ = B/k; il viceversa vale solo se B’ = Bn

• un numero periodico in base 10 è sicuramente: periodico anche in base 2 (perché 10 = 2*5)

• un numero periodico in base 2 può essere o non essere periodico in base 10…

• … ma lo è certamente in base 4, 8, 16, ...

• Intuitivamente: se non bastavano i fattori primi della base B a esprimere il numero in forma finita, la situazione non può certo migliorare avendo meno fattori a disposizione (come accade con B’ = B / k), mentre potrebbe migliorare avendo a disposizione nuovi fattori (come con B” = r * B)

Page 4: NUMERI REALI - unibo.it

NUMERI REALI: MANTISSA E RESTO

Dato un numero reale V, e fissati:• una base B• un naturale N

è sempre possibile esprimere V come somma di due contributi, di cui il primo costituito da esattamente N cifre:

V ” m * Besp + r * Besp-N

mantissa(n cifre)

esponente(intero)

resto(reale)

Page 5: NUMERI REALI - unibo.it

NUMERI REALI: MANTISSA E RESTO

• Esistono infinite triple Æm, esp, ræ che

consentono di esprimere, a parità di B e N, lo stesso numero reale V.

• Ad esempio, se V=31.4357, N=4, B=10:

Page 6: NUMERI REALI - unibo.it

RAPPRESENTAZIONE NORMALIZZATA

• Poiché la rappresentazione deve essere unica, occorre fare una scelta

• Si sceglie la tripla Æm, esp, ræ tale che

1/B £ m < 1, r<1

Rappresentazione normalizzata

Page 7: NUMERI REALI - unibo.it

RAPPRESENTAZIONE NORMALIZZATA

• Poiché la rappresentazione deve essere unica, occorre fare una scelta

• Si sceglie la tripla Æm, esp, ræ tale che

1/B £ m < 1, r<1

Rappresentazione normalizzata

In pratica, è quella in cui la man-tissa è <1, e la sua prima cifra dopo la virgola è diversa da 0

Page 8: NUMERI REALI - unibo.it

NUMERI REALI: IL VINCOLO

• Un numero reale ha spesso una rappre-sentazione infinita in una data base, ma rappresentare infinite cifre è impossibile

• Ergo, assumiamo come rappresentazio-ne approssimata del numero reale V il

solo contributo m * Besp

V » m * Besp

• Il resto si trascura fi Errore di troncamento

Page 9: NUMERI REALI - unibo.it

NUMERI REALI: LE SCELTE OPERATIVE

• In pratica dobbiamo stabilire:

• il numero N di cifre binarie (bit) per la mantissa• il numero P di cifre binarie (bit) per l’esponente• la codifica da adottare per l'esponente• come rappresentare il segno del numero

• Osservazione: nel caso B=2, la mantissa normalizzata è compresa fra 1/2 e 1:

1/2 £ m < 1

fi il primo bit dopo la virgola è sempre 1.

Page 10: NUMERI REALI - unibo.it

NUMERI REALI: LE SCELTE OPERATIVE

• In pratica dobbiamo stabilire:

• il numero N di cifre binarie (bit) per la mantissa• il numero P di cifre binarie (bit) per l’esponente• la codifica da adottare per l'esponente• come rappresentare il segno del numero

• Osservazione: nel caso B=2, la mantissa normalizzata è compresa fra 1/2 e 1:

1/2 £ m < 1

fi il primo bit dopo la virgola è sempre 1.

Ma allora si può evitare di scriverlo esplicitamente! In effetti, un bit prefissato non porta informazione.

Dunque, N cifre binarie richiedono per la memoriz-zazione soltanto N-1 bit.

Page 11: NUMERI REALI - unibo.it

NUMERI REALI: LE SPECIFICHE (IEEE-754)

Page 12: NUMERI REALI - unibo.it

NUMERI REALI: LE SPECIFICHE

Casi speciali (espMAX=255 per i float, 2047 per i double):

• esp=0, m=0 rappresenta 0.0• esp=espMAX m=0 rappresenta – ¥

• esp=espMAX m„0 rappresenta NaN

dove NaN (Not a Number) indica il risultato di operazioniindeterminate o impossibili:

0 / 0 0 * ¥ ¥ - ¥ ¥ / ¥

• esp=0 m„0 rappresenta valori non normalizzati

ciò consente di rappresentare numeri ancora più piccoli, ampliando il range di valori rappresentabili a parità di costo.

Page 13: NUMERI REALI - unibo.it

NUMERI REALI: CIFRE SIGNIFICATIVE

Cifre significative

• Poiché assumendo V » m * Besp trascuriamo

il resto r * Besp-N, e poiché nella forma nornalizzata r<1, l’errore vale:

Eassoluto £ Besp-N

• Esso non è molto significativo in sé: lo è di più se rapportato al valore del numero

Erelativo £ Besp-N / (m * Besp)

• da cui, poiché 1/B £ m < 1,

Erelativo £ Besp-N / Besp-1 = B1-N

Page 14: NUMERI REALI - unibo.it

NUMERI REALI: CIFRE SIGNIFICATIVECifre significative

Se dunque Erelativo £ B1-N , le cifre

decimalisignificative risultano:• float

• N=24 Er £ 2-23 = 10-23*log2 = 10-7

• circa 6-7 cifre decimali significative

• double

• N=53 Er £ 2-52 = 10-52*log2 = 10-15

• circa 14-15 cifre decimali significative

Page 15: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 1

Rappresentazione come float di V = 1.0

• rappr. normalizzata: V = 1.010 = 0.12 * 21

• segno (1 bit): 0• mantissa (24 bit): .10000000 00000000 00000000• esponente (8 bit con eccesso 126)

esp=1 fi 126+1 = 127 fi 01111111

in memoria:

Page 16: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 2

Rappresentazione come float di V = 5.875

• rappr. normalizzata: V = 101.1112 = .1011112 * 23

• segno (1 bit): 0• mantissa (24 bit): .10111100 00000000 00000000• esponente (8 bit con eccesso 126)

esp=3 fi 126+3 = 129 fi 10000001

in memoria:

Page 17: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 3

Rappresentazione come float di V = -29.1875

• rappr. normalizzata: V = - .1110100112 *25

• segno (1 bit): 1• mantissa (24 bit): .11101001 10000000 00000000• esponente (8 bit con eccesso 126)

esp=5 fi 126+5 = 131 fi 10000011

in memoria:

Page 18: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 4

Rappresentazione come float di V = 0.110

• rappr. normalizzata: V =.0(0011)2 periodico!

• segno (1 bit): 0• mantissa (24 bit): .11001100 11001100 11001100• esponente (8 bit con eccesso 126)

esp=-3 fi 126-3 = 123 fi 01111011

in memoria:

Page 19: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 4

Rappresentazione come float di V = 0.110

• rappr. normalizzata: V =.0(0011)2 periodico!

• segno (1 bit): 0• mantissa (24 bit): .11001100 11001100 11001101• esponente (8 bit con eccesso 126)

esp=-3 fi 126-3 = 123 fi 01111011

in memoria:

Errore di troncamentoo si tronca o si arrotonda

di solito si arrotonda

Page 20: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 5

Rappresentazione come float di V = 0.1510

• rappr. normalizzata: V =.00(1001)2 periodico!

• segno (1 bit): 0• mantissa (24 bit): .10011001 10011001 10011010• esponente (8 bit con eccesso 126)

esp=-2 fi 126-2 = 124 fi 01111100

in memoria:

Page 21: NUMERI REALI - unibo.it

NUMERI REALI: ESEMPIO 6

Rappresentazione come float di V = -1/310

• rappr. normalizzata: V = -.(01)2 periodico!

• segno (1 bit): 1• mantissa (24 bit): .10101010 10101010 10101011• esponente (8 bit con eccesso 126)

esp=-1 fi 126-1 = 125 fi 01111101

in memoria:

Page 22: NUMERI REALI - unibo.it

ESPERIMENTI: SPIARE DENTRO JAVA

Come verificare se quanto calcolato è esatto?

• Occorre un modo per "spiare" dentro la macchina virtuale del linguaggio (Java, C, Pascal, …)

• In Java, la classe wrapper Float (risp. Double) fornisce la funzione floatToIntBits (risp. doubleToLongBits)

• Tale funzione "estrae" la rappresentazione di un float (risp. double) bit per bit e la pone in un int (risp. long) pronta per la stampa o altre elaborazioni.

Page 23: NUMERI REALI - unibo.it

ESEMPIO: SPIARE UN FLOAT in Java

Esempio di codice che "spia" un float f:

System.out.println("Numero float: " + f);

int internalRep = Float.floatToIntBits(f);

// converto l'intero in stringa binaria// tramite una variante di toStringString binaryString = Integer.toBinaryString(internalRep);

// aggiungo '0' davanti fino ad avere 32 bit// dato che toBinaryString non mette zeri inizialiwhile (binaryString.length()<32) binaryString = "0" + binaryString;

// stampo la stringa a videoSystem.out.println(binaryString);

Page 24: NUMERI REALI - unibo.it

ESPERIMENTI: MIGLIORIE ESTETICHE• La versione precedente stampa un'unica stringa di 32

bit, praticamente illeggibile per noi: 10111110101010101010101010101011

• meglio sarebbe separare le varie parti, ad esempio: 1 01111101 01010101010101010101011

o magari: 1 01111101 0101010 10101010 10101011

Per farlo: System.out.println(binaryString.charAt(0) + " " +binaryString.substring(1,9) + " " +binaryString.substring(9,16) + " " +binaryString.substring(16,24) + " " +binaryString.substring(24,32) );

Page 25: NUMERI REALI - unibo.it

OPERAZIONI FRA REALI & ERRORI

• Negli interi, si possono creare errori nelle operazioni, ma gli operandi sono comunque rappresentati esattamente (entro il range)

• Nei reali, invece, già gli stessi operandi pos-sono essere già affetti da errore a causa dell’impossibilità di rappresentare le infinite cifre dei numeri periodici e irrazionali: è l’errore di troncamento.

• Errore di troncamento = ogni qual volta il numero di cifre disponibili è insufficiente.

Page 26: NUMERI REALI - unibo.it

ERRORE DI TRONCAMENTO• Si manifesta quando

• il numero è periodico

• il numero non è periodico ma ha troppe cifre

• il risultato di un’operazione, a causa un riporto, richiede troppe cifre

• Esempi (mantissa di 8 bit, per semplicità)

• 15.810 = .1111110011001100... * 24 (è 15.75)

• 300.510 = .10010110012 * 29 (è 300)

• 15110 + 16010 =

= .10010111 * 28 + .10100000 * 28 =

= .100110111 * 29 (è 310)

Page 27: NUMERI REALI - unibo.it

OPERAZIONI FRA REALI & ERRORI

Vi sono poi altre due sorgenti di errore:• l’errore di incolonnamento

• è causato dalla necessità di incolonnare i numeri per poterli sommare o sottrarre

• l’errore di cancellazione• è la conseguenza finale della presenza, a

monte, di errori di troncamento, che possono far sì che alcune cifre del risultato non siano affidabili, ovvero siano “virtualmente cancellate”

• si manifesta sottraendo numeri simili fra loro.

Page 28: NUMERI REALI - unibo.it

ERRORE DI INCOLONNAMENTO

L’errore di incolonnamento è causato dalla necessità di incolonnare i numeri per poterli sommare o sottrarre

• per incolonnare due numeri che, in forma normalizzata, hanno esponente diverso bisogna per forza“de-normalizzarne” uno

• si allinea quello di valore assoluto minore a quello di valore assoluto maggiore

• ciò causa una perdita di cifre significative nel numero che viene “de-normalizzato”.

Page 29: NUMERI REALI - unibo.it

ERRORE DI INCOLONNAMENTO

Esempio: 96.5 + 1.75• Ipotesi: mantissa di 8 bit (per semplicità)

• 96.510 =.110000012 * 27 (senza errore)

• 1.7510 =.111000002 * 21 (senza errore)

Somma:

.110000012 * 27 + .110000012 * 27 +

.111000002 * 21 = .000000112 * 27 =

.110001002 * 27

Page 30: NUMERI REALI - unibo.it

ERRORE DI INCOLONNAMENTO

Esempio: 96.5 + 1.75• Ipotesi: mantissa di 8 bit (per semplicità)

• 96.510 =.110000012 * 27 (senza errore)

• 1.7510 =.111000002 * 21 (senza errore)

Somma:

.110000012 * 27 + .110000012 * 27 +

.111000002 * 21 = .000000112 * 27 =

.110001002 * 27

cifre perse:è l’errore di

incolonnamento È 98, non 98.25 come doveva!

Page 31: NUMERI REALI - unibo.it

ERRORE DI INCOLONNAMENTO: ESPERIMENTO

public static void test() {

double val1 = 12345.0;

double val2 = 1e-16; // proprio al limite…

// errore di incolonnamento: // val1 + val2 COINCIDE con val1 !

if (val1 + val2 == val1) System.out.println("val1 + val2 == val1 !!");

}

---Java Run---val1 + val2 == val1 !!

Page 32: NUMERI REALI - unibo.it

ERRORI: ESPERIMENTO

public static void test1() {

double val1 = 0.1; // sembra 0.1 .. ma non lo è !double val2 = 0.3; // sembra 0.3 .. ma non lo è !

System.out.println(val1); // stampa 0.1 .. ma è un'illusione !System.out.println(val2); // stampa 0.3 .. ma è un'illusione !

// … e infatti, il triplo di val1 non è val2 !!!

double d = val1 + val1 + val1; // non è il triplo di val1!

if (d != val2) { System.out.print("ERRORE di "); System.out.println(d - val2);} // differenza di 5.5E-17

}val1 = 0.1val2 = 0.3

ERRORE di 5.551115123125783E-17

Page 33: NUMERI REALI - unibo.it

ERRORE DI CANCELLAZIONE

L’errore di cancellazione può presentarsi quando si sottraggono due numeri molto simili fra loro

• accade solo se in almeno uno dei due operandi, all’inizio, vi è stato errore di troncamento

• consiste nel fatto che si introducono zeri da destra per normalizzare il risultato, ma quegli zeri non sono significativi

• se ci fossero state le cifre perse all’inizio a causa del troncamento, il risultato sarebbe stato diverso.

Page 34: NUMERI REALI - unibo.it

ERRORE DI CANCELLAZIONE

Esempio: 15.8 - 15.5• Ipotesi: mantissa di 8 bit (per semplicità)

• 15.810 =.111111002 * 24 (con errore tronc.)

• 15.510 =.111110002 * 24 (senza errore)

Differenza:

.111111002 * 24 -

.111110002 * 24 =

.000001002 * 24 = . 100000002 * 2-1

Page 35: NUMERI REALI - unibo.it

ERRORE DI CANCELLAZIONE

Esempio: 15.8 - 15.5• Ipotesi: mantissa di 8 bit (per semplicità)

• 15.810 =.111111002 * 24 (con errore tronc.)

• 15.510 =.111110002 * 24 (senza errore)

Differenza:

.111111002 * 24 -

.111110002 * 24 =

.000001002 * 24 = . 100000002 * 2-1

cifre cancellate:è l’errore di

cancellazione

Sono 0 solo perché abbiamo troncato 15.8 all’inizio: avrebbero dovuto essere 11001

Page 36: NUMERI REALI - unibo.it

ERRORI: CONSEGUENZE

• A causa di questi errori, la proprietà associativa può non essere più verificata

• Esempio (mantissa di 8 bit, per semplicità)

• X = 0,75 fi .11000000 * 20 (senza errori)

• Y = 65,6 fi .10000011 * 27 (err. troncamento)

• Z = 64,0 fi .10000000 * 27 (senza errori)

• ORRORE!(X + Y) - Z è diverso da X + (Y - Z)

Page 37: NUMERI REALI - unibo.it

ERRORI: CONSEGUENZE

(X + Y) - Z è diverso da X + (Y - Z)

R = .10000000 * 22 R = .10010000 * 22

Page 38: NUMERI REALI - unibo.it

ACCUMULAZIONE DI ERRORI

• La presenza di errori che si accumulano può portare a risultati totalmente assurdi

• Esempio: Calcolo di p con l’algoritmo di Euclide

Una circonferenza di raggio 1 è lunga 2p,che può essere approssimata:

• dall’esterno, dal perimetro del poligono regolare di n lati circoscritto

• dall’interno, dal perimetro del poligono regolare di n lati inscritto

Page 39: NUMERI REALI - unibo.it

ACCUMULAZIONE DI ERRORI

Valgono le relazioni:

• ln = lato del poligono di n lati inscritto

• Ln = lato del poligono di n lati circoscritto

= 2 l / Ö (4 – l 2)

Page 40: NUMERI REALI - unibo.it

L'ALGORITMO IN JAVA (1/2)import java.io.*;

public class PigrecoEuclide {

public static void main(String[] args) {

System.out.println("Calcolo di pigreco con FLOAT."); System.out.print("Precisione [1e-8] ? ");

float eps = 1E-8F; // inizializz. richiesta da eccezione

try{

BufferedReader kbd = new BufferedReader( new InputStreamReader(System.in));

eps = Float.parseFloat(kbd.readLine());}catch(IOException e){

System.err.println("Errore di input - Program exit");System.exit(1);

}...

Page 41: NUMERI REALI - unibo.it

L'ALGORITMO IN JAVA (2/2) ... // algoritmo

float nlati = 4.0F, ln = (float) Math.sqrt(2.0);float smpinf, smpsup;

do {float OC2 = (float) Math.sqrt(4.0 - ln * ln); nlati *= 2.0;ln = (float) Math.sqrt(2.0F - OC2);smpinf = ln * nlati / 2.0F;smpsup = ln * nlati / OC2;System.out.println("nl=" + nlati + " d2=" + OC2 +

" piInf=" + smpinf + " piSup=" + smpsup);} while ((smpsup-smpinf >= eps) && (nlati < 1e+19));

}}

Page 42: NUMERI REALI - unibo.it

L'OUTPUTCalcolo di pigreco con FLOAT.Precisione (suggerito 1e-8)? 1e-8

nl=8.0 d2=1.4142137 piInf=3.0614672 piSup=4.329568nl=16.0 d2=1.8477591 piInf=3.1214445 piSup=3.378627nl=32.0 d2=1.9615706 piInf=3.1365461 piSup=3.1979947nl=64.0 d2=1.9903694 piInf=3.1403334 piSup=3.155528nl=128.0 d2=1.9975909 piInf=3.1412857 piSup=3.1450741nl=256.0 d2=1.9993976 piInf=3.1415188 piSup=3.1424654nl=512.0 d2=1.9998494 piInf=3.1412080 piSup=3.1414444nl=1024.0 d2=1.9999623 piInf=3.1424513 piSup=3.1425104nl=2048.0 d2=1.9999906 piInf=3.1424513 piSup=3.142466nl=4096.0 d2=1.9999976 piInf=3.1622777 piSup=3.1622815nl=8192.0 d2=1.9999994 piInf=3.1622777 piSup=3.1622787nl=16384.0 d2=1.9999999 piInf=2.8284270 piSup=2.8284273nl=32768.0 d2=2.0 piInf=0.0 piSup=0.0