Appunti di Calcolo Numerico

Documenti analoghi
Numeri fixed point. La rappresentazione dei numeri interi: i numeri fixed point. Rappresentazione fixed point di un intero positivo N

CALCOLO NUMERICO. Rappresentazione virgola mobile (Floating Point)

Rappresentazione dei dati reali e teoria degli errori. N. Del Buono

Aritmetica dei Calcolatori Elettronici

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Analogico vs. Digitale. LEZIONE II La codifica binaria. Analogico vs digitale. Analogico. Digitale

Corso di Matematica per la Chimica

Unità aritmetica e logica

Rappresentazione dei dati in memoria

Codifica. Rappresentazione di numeri in memoria

Elaborazione aut. dei dati

Corso di Matematica per la Chimica. Dott.ssa Maria Carmela De Bonis a.a

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Calcolo numerico e programmazione Rappresentazione dei numeri

N= a i b i. Numeri e numerali. Sistemi di Numerazione Binaria. Sistemi posizionali. Numeri a precisione finita

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Numeri in virgola. Marco D. Santambrogio Ver. aggiornata al 10 Novembre 2015

La codifica. dell informazione

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Numeri in virgola. Marco D. Santambrogio Ver. aggiornata al 14 Novembre 2014

Analisi degli errori

Rappresentazione dei Numeri

Derivazione numerica. Introduzione al calcolo numerico. Derivazione numerica (II) Derivazione numerica (III)

Conversione di base. Conversione decimale binario. Si calcolano i resti delle divisioni per due

CALCOLO NUMERICO. Aritmetica di macchina e analisi degli errori

Lezione 3. I numeri relativi

Numeri reali. Notazione scientifica (decimale) Floating Point. Normalizzazione. Esempi. Aritmetica del calcolatore (virgola mobile)

Somma di numeri floating point. Algoritmi di moltiplicazione e divisione per numeri interi

Codifica di informazioni numeriche

Sistema Numerico Decimale

Rappresentazione di Numeri Reali. Rappresentazione in virgola fissa (fixed-point) Rappresentazione in virgola fissa (fixed-point)

Sperimentazioni di Fisica I mod. A Lezione 3

Numeri di macchina. Lucia Gastaldi. DICATAM - Sez. di Matematica,

Rappresentazione in virgola mobile Barbara Masucci

Rappresentazione dei numeri reali in un calcolatore

Cancellazione numerica e zeri di funzione. Dott. Marco Caliari

Sistemi di Numerazione Binaria

Moltiplicazione. Divisione. Multipli e divisori

Sistemi di Numerazione Binaria

Calcolatori Elettronici Parte III: Sistemi di Numerazione Binaria

Elementi di Algebra e di Matematica Discreta Numeri interi, divisibilità, numerazione in base n

Lezione 4. Sommario. L artimetica binaria: I numeri relativi e frazionari. I numeri relativi I numeri frazionari

Sistemi di Numerazione Binaria

Appunti di matematica per le Scienze Sociali Parte 1

Esercitazione del 09/03/ Soluzioni

Somma di numeri binari

Corso di Matematica per la Chimica

Gli errori nella risoluzione di un problema

Problema numerico. Relazione funzionale chiara e non ambigua tra dati iniziali e la soluzione. Dati iniziali e soluzione sono due vettori finiti

Note del corso di Laboratorio di Programmazione e Calcolo: Analisi della stabilità e della complessità computazionale di un algoritmo

GLI ERRORI. Problema. valutare l'accuratezza del risultato di un calcolo e quindi l'affidabilità del risultato stesso. Prof.

Esercizi di Analisi Numerica. Errori, Cambi di base, Numeri macchina, Aritmetica finita

Fondamenti di Programmazione. Sistemi di rappresentazione

Rappresentazione dell informazione

Rappresentazione in virgola mobile. 5 ottobre 2015

Corso di Matematica per la Chimica

Rappresentazione dei numeri reali

Un monomio è in forma normale se è il prodotto di un solo fattore numerico e di fattori letterali con basi diverse. Tutto quanto sarà detto di

Numeri in virgola mobile

04 Aritmetica del calcolatore

La Rappresentazione dell Informazione

Corso di Laurea Specialistica in Ingegneria Meccanica e Ingegneria Energetica Progetto numerico al calcolatore

Informazione binaria: - rappresentazione dei numeri razionali -

Precorso di Matematica

Codifica binaria. Rappresentazioni medianti basi diverse

Sistemi di Numerazione

Cap. 2 - Rappresentazione in base 2 dei numeri interi

LA CODIFICA DELL INFORMAZIONE

Rappresentazione dell Informazione

modificato da andynaz Cambiamenti di base Tecniche Informatiche di Base

Corso di Calcolo Numerico Informatica e Comunicazione Digitale - Taranto A.A. 2015/2016

INTERPOLAZIONE. Introduzione

Abilità Informatiche e Telematiche

Calcolatori: Sistemi di Numerazione

Rappresentazione numeri relativi e reali

Rappresentazione dei Dati

CONVERSIONE DA DECIMALE A BINARIO

Rappresentazione di numeri relativi (interi con segno) Rappresentazione di numeri interi relativi (con N bit) Segno e Valore Assoluto

LOGARITMI. Corso di laurea: BIOLOGIA Tutor: Floris Marta; Max Artizzu PRECORSI DI MATEMATICA. L uguaglianza: a x = b

Esercitazioni di Matematica Generale A.A. 2016/2017 Pietro Pastore Lezione del 21 Novembre Logaritmi e Proprietà

Esercitazioni su rappresentazione dei numeri e aritmetica. Interi unsigned in base 2

Fondamenti di Programmazione. Sistemi di rappresentazione

Corso di Analisi Matematica. Polinomi e serie di Taylor

Firmware Division & Floating pointer adder

Sistemi lineari. Lorenzo Pareschi. Dipartimento di Matematica & Facoltá di Architettura Universitá di Ferrara

Rappresentazione. Notazione in complemento a 2. Complemento a due su 3 e 4 bit Complemento a due

Conversione binario-decimale. Interi unsigned in base 2. Esercitazioni su rappresentazione. dei numeri e aritmetica

Riassunto Nell'esercitazione di oggi e' stata introdotta la codifica binaria naturale, intera e razionale in virgola fissa. Il materiale teorico

Interi unsigned in base 2. Esercitazioni su rappresentazione dei numeri e aritmetica. Conversione binario-decimale

I numeri reali e la loro rappresentazione

La codifica digitale

Rappresentazione numeri reali

La codifica. dell informazione

Rappresentazione di numeri reali. Architetture dei Calcolatori (Lettere. Perché la rappresentazione in virgola mobile

Introduzione e Nozioni di Base. Prof. Thomas Casali

Appunti del corso di Sistemi - Conversioni numeriche anno scolastico 2007/2008

Esercitazione del 2/3/2010- Numeri binari e conversione

Lezione 4. Lezione 4. Rappresentazioni numeriche. Rappresentazioni numeriche. Rappresentazioni numeriche. Rappresentazioni numeriche

Lezioni di Informarica. Prof. Giovanni Occhipinti

I.4 Rappresentazione dell informazione

Laboratorio del 21/10/2010- Numeri binari e conversione

Prontuario degli argomenti di Algebra

Transcript:

Appunti di Calcolo Numerico a cura di Annamaria Mazzia Università degli Studi di Padova Corso di Calcolo Numerico per Ingegneria Meccanica - Sede di Vicenza a.a.2005/2006

Lezioni su Rappresentazione dei numeri nel calcolatore Un introduzione al calcolo numerico: la rappresentazione dei numeri al calcolatore, l instabilità di un algoritmo, il malcondizionamento di un problema. Sommario 1 Unicità della rappresentazione in base N............ 1 2 Conversione di base.......................... 3 3 Rappresentazione IEEE dei numeri di macchina....... 4 4 Precisione numerica.......................... 8 5 Propagazione degli errori...................... 9 6 Instabilità e malcondizionamento................. 15 6.1 Instabilità............................. 15 6.2 Malcondizionamento....................... 18 1 Unicità della rappresentazione in base N Un generico numero a può essere rappresentato in base N utilizzando N simboli, 0, 1,..., N 1. Si scriverà dunque come: a = a m N m + a m 1 N m 1 +... + a 1 N + a 0 + a 1 N 1 + a 2 N 2 +... a n N n dove m e n sono interi naturali e a k, k = m, m 1,..., n sono interi naturali compresi tra 0 e N 1. Esempio In base 10, il numero 726.625, scritto in forma estesa è dato dalla forma: 7 10 2 + 2 10 1 + 6 + 6 10 1 + 2 10 2 + 5 10 3 1

1. Unicità della rappresentazione in base N 2 Abbiamo supposto che il numero abbia una rappresentazione finita ma anche nel caso più generale avremo una rappresentazione simile. Dimostriamo che tale rappresentazione è unica. Dimostrazione. Proviamo, innanzitutto, che ogni numero a è tale che N m a < N m+1. Se si pensa ad un numero in base decimale, questo è ovvio, nel senso che (ad esempio) un numero con due cifre intere (m = 1) può variare da 10 fino a 99, cioè è compreso nell intervallo 10 a < 10 2. Supponiamo, dunque, che lo stesso numero a possa rappresentarsi - nella stessa base N - come a = a m N m + a m 1 N m 1 +... = b p N p +... a p 1 N p 1... con a m 0, b p 0. E proviamo che necessariamente deve essere p = m e b k = a k per ogni k = m, m 1,.... Per provare ciò, si consideri che il valore minimo che può assumere a, con m fissato, si ha ponendo a m = 1 e a k = 0 per k m, da cui a N m Analogamente, il valore massimo che può assumere a si ha ponendo ciascun a k = N 1, per cui 1 a max = (N 1)N m + (N 1)N m 1 +... + (N 1)N 1 +... (N 1)N n = (N 1)(N m + N m 1 +... + N 0 + N + N 1 +... N n ) m = (N 1) N k = n n+m = (N 1)N m 0 N k < (N 1)N m 1 1 1/N = N m+1 Quindi, N m a < N m+1. Ora se fosse p m, ad esempio p < m, avremmo p + 1 m e N p+1 N m. D altro canto, ripetendo il ragionamento fatto prima, si avrebbe a < N p+1. Ma allora a < N p+1 N m dà pure a < N m, un assurdo, visto che N m a. Se, invece, fosse p > m, avremmo p m + 1 e N p N m+1. Ma a < N m+1 e a N p N m+1, da cui a N m+1 : avremmo di nuovo un assurdo. 1 si tenga conto che 1 k=0 N = 1 k 1 1/N

2. Conversione di base 3 Perciò, necessariamente, deve essere p = m. Si può dunque scrivere: (a m b m )N m + (a m 1 b m 1 )N m 1 +... = 0 Proviamo che a k = b k per ogni k. Supponendo a m b m > 0 possiamo scrivere l equazione precedente come: a m b m = a m 1 b m 1 N + a m 2 b m 2 N 2 +... Al primo membro abbiamo un numero intero, mentre il secondo membro è certamente una quantità minore di 1 in quanto può essere maggiorata dalla quantità N 1 N + N 1 N 2 +... (N 1) k=1 1 N k = (N 1)( 1 1 1/N 1) = (N 1)( N N 1 1) = 1 L uguaglianza può sussistere solo se ambo i membri sono uguali a zero, cioè per a m = b m. Ripetendo lo stesso ragionamento si trova che a k = b k per ogni k. 2 Conversione di base Si vuole passare da una rappresentazione in base M ad una in base N: a = a m M m + a m 1 M m 1 +... + a 1 M + a 0 + a 1 M 1 +... + a n M n = b r N r + b r 1 N r 1 +... + b 1 N + b 0 + b 1 N 1 +... + a s N s Osserviamo che un numero può avere una rappresentazione finita in una base ma infinita in un altra base e viceversa. Uguagliamo le parti intere delle due rappresentazioni e dividiamo per N, con i calcoli eseguiti nella base di partenza M: (a m M m + a m 1 M m 1 +... + a 1 M + a 0 )/N = (b r N r + b r 1 N r 1 +... + b 1 N + b 0 )/N (a m M m + a m 1 M m 1 +... + a 1 M + a 0 )/N = b r N r 1 + b r 1 N r 2 +... + b 1 + b 0 N Deduciamo che il resto della divisione per N della parte intera di a è b 0, espresso nella base M. Dividendo successivamente il quoziente appena trovato per N, si ottiene come resto b 1, b 2,..., b r 1 fino all ultimo quoziente indivisibile per N, che ci dà b r. I calcoli si eseguono in base M, in cui è pure espressa la base N. Uguagliando invece le parti decimali e moltiplicando ogni volta per N otteniamo, come parti intere, i coefficienti b 1, b 2,..., sempre espressi nella base M: (a 1 M 1 + a 2 M 2 +... +)N = b 1 + b 2 N 1 + b 3 N 2 +...

3. Rappresentazione IEEE dei numeri di macchina 4 Esempio Vogliamo convertire il numero 725.625 dalla base 10 nella base 2 725 362 1 b 0 362 181 0 b 1 181 90 1 b 2 90 45 0 b 3 Per la parte intera si ha: 45 22 1 b 4 22 11 0 b 5 11 5 1 b 6 5 2 1 b 7 2 1 0 b 8 1 0 1 b 9.625 2 = 1.250 b 1 = 1 Per la parte decimale:.250 2 = 0.50 b 2 = 0.5 2 = 1.0 b 3 = 1.0 2 = 0.0 In base 2 il numero diventa 1011010101.101. Questo modo di procedere diventa alquanto laborioso quando i calcoli devono essere eseguiti in una base diversa da quella decimale, per cui conviene sempre passare alla base decimale e poi da questa all altra base utilizzando la rappresentazione polinomiale del numero. Il passaggio dalla base 2 alle basi 4, 8, 16 sono semplici considerando che 4 = 2 2, 8 = 2 3, 16 = 2 4. Basta allora suddividere il numero binario in gruppi di 2, 3 e 4 cifre, rispettivamente, per passare alle basi 4, 8 e 16. Per passare dalla base 4 alle base 16, si suddivide il numero in gruppi di due considerando che 16 = 4 2. Non si può invece passare così facilmente dalla base 8 alla bsae 16 perchè l una non è potenza dell altra. Il perchè del passaggio da una base ad un altra semplificato nel caso di una base potenza dell altra lo si vede subito vedendo il caso delle basi 2 e 4. In base 2 sono possibili le sole cifre 0 e 1. In base 4 invece abbiamo 0, 1, 2 e 3. Ora, tutte le possibili combinazioni delle coppie di cifre 0 e 1 sono: 00, 01, 10, 11 vale a dire 0, 1, 2 e 3 in base 4. Perciò prendendo a due a due coppie di cifre in base 2 ottengo la rappresentazione in base 4. 3 Rappresentazione IEEE dei numeri di macchina Lo sviluppo dei calcolatori ha promosso e sviluppato l uso del sistema binario, in cui ciascun numero è rappresentato da una successione di cifre binarie (0 e 1). Ma come avviene la rappresentazione di un numero nel calcolatore? Come rappresentare un numero a infinite cifre in maniera accurata utilizzando solo un numero finito di cifre? Abbiamo la rappresentazione in virgola mobile (floating point) - che in genere è preferibile rispetto a quella in virgola fissa - e la maggior parte dei computers

3. Rappresentazione IEEE dei numeri di macchina 5 seguono gli standard dell IEEE ( Institute of Electrical and Electronics Engineers) nella base 2. Un numero in floating point nella rappresentazione IEEE viene scritto come dove a = ±(1 + f 1 2 1 + f 2 2 2 +... + f m 2 m ) 2 p, 1 + f 1 2 1 + f 2 2 2 +... + f m 2 m riservati un numero m di bits, è la mantissa, normalizzata, cui sono p è la potenza della base 2 cui sono riservati un numero Ne di bits ed è limitato a variare in un determinato intervallo [L, U]. Il primo 1 della mantissa (che corrisponde a f 0 ) non viene messo in memoria ma c è, per cui la rappresentazione del numero è data nel modo seguente: s e e e e e e f f f f f f }{{} segno } {{ } esponente } {{ } mantissa Abbiamo 1 bit riservato al segno (si ha 0 per il segno + e 1 per il segno ), un numero Ne di bits per l esponente 2 e, e un numero m di bits per la mantissa. La scelta del numero di bits da riservare all esponente e alla mantissa si basa su un compromesso tra la dimensione dell esponente (e quindi il più piccolo e il più grande numero rappresentabile) e la dimensione della mantissa (e quindi la precisione del numero rappresantibile, più o meno cifre decimali). Nel sistema IEEE, la rappresentazione in singola precisione è a 32 bits mentre quella in doppia precisione è a 64 bits. La suddivisione dei bits tra esponente e mantissa viene ripartita nel modo seguente: Singola precisione Doppia precisione s 1 s 1 Ne 8 Ne 11 m 23 m 52 bits 32 bits 64 L esponente viene rappresentato in forma biased (parziale, influenzata da un altro numero), nel senso che se p è l esponente, noi consideriamo il valore b + p dove b è il numero b = 0111 }{{... 1}, quindi b = 1+2+2 2 +...+2 Ne 2 +0 2 Ne 1 = 1 2Ne 1 = 1 2 Ne bits 2 Ne 1 1. Per trovare il limite superiore e inferiore entro cui può variare p, dobbiamo tener conto del fatto che, nella rappresentazione IEEE, due patterns di bits sono riservati per rappresentare numeri speciali quali lo zero, infinito e il Not-a-Number: sono 0000... 0 e 1111... 1.

3. Rappresentazione IEEE dei numeri di macchina 6 Quindi, per rappresentare un numero reale b+p non può essere uguale a 1111... 1: ciò significa che il massimo esponente che si può rappresentare è dato sottraendo a 1111... 1 il valore 1 in base 2, cioè da 1111... 1 0000... 01 = 1111... 10. Si ha b + p 1111... 10, o equivalentemente, 0111... 1 + p 1111... 10, da cui ricaviamo p 1111... 10 0111... 1 = 0111... 1 = b. Il limite superiore U è proprio uguale a b. Per il limite inferiore abbiamo: 0000... 0 < b + p cioè, equivalentemente, b < p b + 0000... 01 p. Quindi il limite inferiore è L = (b 1). In singola precisone, il valore b è dato da b = 0111 }{{... 1} : in base 10 b = 127 10, da 8 bits cui l intervallo [L, U] = [ 126, 127]. In doppia precisione, invece, b = 1023 10 da cui [L, U] = [ 1022, 1023]. Per quanto riguarda la mantissa, sono ad essa riservati m bits. Considerando anche l 1 della normalizzazione, la precisione è di m + 1 bits. Il più grande numero che si può rappresentare è, quindi: 1. 111 }{{... 1} 2 U = m bits m k=0 2 k 2 U = 1 2 (m+1) 1 2 1 2 U = (2 2 m )2 U 2 U+1 Il più piccolo numero positivo rappresentabile è dato, invece, da: 1. 000 }{{... 0} 2 L = 2 L m bits Se si vuole rappresentare un numero al di fuori di questo intervallo si ha overflow o underflow. In singola e doppia precisione abbiamo, per il più grande e il più piccolo numero positivo rappresentabile, il seguente prospetto: Singola precisione Doppia precisione Massimo 3.4 10 38 10 308 Minimo 1.2 10 38 2.2 10 308 Esempio Vogliamo scrivere il numero 5.75 10 in formato IEEE in singola precisione. Effettuiamo prima la conversione in base 2: 5 2 1 b 0 Per la parte intera: 2 1 0 b 1 1 0 1 b 2

3. Rappresentazione IEEE dei numeri di macchina 7.75 2 = 1.50 b 1 = 1 Per la parte decimale:.5 2 = 1.0 b 2 = 1.0 2 = 0.0 Quindi 5.75 10 = 101.11 2 = 1.0111 2 2. Memorizziamo ora il numero in singola precisione: Per l esponente: (b + p) 10 = (127 + 2) 10 = 129 10 = 10000001 2 Per la mantissa, m = 23 e si deve trascurare l 1 della normalizzazione 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 è: Il segno è positivo, quindi s = 0 Perciò la memorizzazione, considerati i bits per il segno, l esponente e la mantissa 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0... 0 0 0 0 0 0 0 }{{} s } {{ } esponente } {{ } mantissa Consideriamo, ora, la rappresentazione dei numeri speciali. Per convenzione si pone uguale a 0 la rappresentazione che vede tutti zero sia nel segno, sia nell esponente che nella mantissa (non dimentichiamo che il valore 1 della normalizzazione non è messo in memoria ma c è e quindi non potremmo mai avere il valore 0 - perciò lo si pone per convenzione). Per i valori ± si considerano tutti 1 nello spazio dedicato all esponente e tutti 0 nello spazio dedicato alla mantissa: 0 / 1 1 1 1... 1 1 0 0 0... 0 0 }{{} s } {{ } esponente } {{ } mantissa I valori ± si hanno se si fa una divisione per zero o si fa un calcolo che comporta overflow. Si ha invece il Not-a-Number quando si ottiene il risultato di un calcolo non è definito, come 0/0 o log 0. A seconda della macchina si ha: Il NaNS: si ha un segnale di errore 0 1 1 1... 1 1 0 1 1... 1 1 }{{} s } {{ } esponente } {{ } mantissa

4. Precisione numerica 8 Il NaNQ: il calcolo continua comunque... 0 1 1 1... 1 1 1 0 0... 0 0 }{{} s } {{ } esponente 4 Precisione numerica } {{ } mantissa Un numero può avere una rappresentazione finita o infinita. Basti pensare al valore di π o a 2 in base 10. Abbiamo anche visto che un numero può avere rappresentazione finita in una base ma infinita in un altra. Esempio Scriviamo il numero 1.1 10 in base 2. Per la parte intera: 1 0 1 b 0.1 2 = 0.2 b 1 = 0.2 2 = 0.4 b 2 = 0.4 2 = 0.8 b 3 = 0.8 2 = 1.6 b 3 = 1 Per la parte decimale:.6 2 = 1.2 b 4 = 1.2 2 = 0.4 b 5 = 0.4 2 = 0.8 b 6 = 0.8 2 = 1.6 b 7 = 1.6 2 = 1.2 b 8 = 1.2 2 = 0.4 b 9 = 0 Osserviamo che nella parte decimale si ripetono all infinito le cifre 0011. Il numero in base 2 si scrive infatti come: 1.0 0011 }{{} 0011 }{{}... Quando rappresentiamo un numero al calcolatore sarà possibile memorizzare solo un certo numero di cifre: come esprimerlo? Per lasciare maggiore generalità al discorso, consideriamo una base N. Sia a = ±( k=0 b kn k )N p il numero esatto. In floating-point esso sarà espresso come a = ±( t 1 k=0 b k N k )N p, esso, cioè, sarà arrotondato. Ci sono due modi per arrotondare un numero troncamento a = tronc(a), dove p = p e b k = b k per k = 0,..., t 1. Le altre cifre, b t, b t 1,... sono ignorate. arrotondamento simmetrico a = arr(a) = tronc(a + 1 2 N t+1 N p ), aggiungiamo un unità a b t+1 se b t N/2. L errore assoluto che si commette approssimando il numero a con a sarà, dunque,

5. Propagazione degli errori 9 N 1 t N p nel troncamento errore assoluto a a 1 2 N 1 t N p nell arrotondamento Per l errore relativo, invece, si ha: errore relativo a a N 1 t nel troncamento 1 a 2 N 1 t nell arrotondamento Il valore 1 2 N 1 t è il numero conosciuto come precisione di macchina. Esempio Nel caso della rappresentazione IEEE di un numero, con t 1 = m, l errore di arrotondamento che si commette è: In singola precisione avremo a a 2 (m+1) a a 2 24 5.96 10 8 ciò significa che avremo 8 cifre decimali corrette. In doppia precisione avremo a a 2 53 1.11 10 16 ciò significa che avremo 16 cifre decimali corrette. 5 Propagazione degli errori Prima di vedere come si propagano gli errori nelle operazioni elementari di moltiplicazione, divisione, addizione e sottrazione, vediamo il concetto di cifre significative. Le cifre significative sono quelle che danno un informazione effettiva sul valore del numero, indipendentemente dalla parte esponenziale. È chiaro che il contenuto delle informazioni sulle cifre va diminuendo via via che ci si sposti da sinistra verso destra. Quando un numero è arrotondato e rappresentato in modo da includere solo cifre significative, la prima cifra a destra del punto decimale è sempre diversa da zero. Vediamo ora come si propagano gli errori nelle operazioni elementari. Supponiamo che i numeri su cui lavoriamo siano affetti da errore (di arrotondamento), mentre le operazioni siano eseguite in modo esatto. Indichiamo con o una qualunque delle operazioni elementari {, /, +, } e indichiamo con fl(x) il numero x rappresentato in floating point e arrotondato, quindi fl(x) = x(1 + e x ) dove e x è l errore di arrotondamento.

5. Propagazione degli errori 10 Allora fl(x o y) = fl(x) o fl(y) = x(1 + e x ) o y(1 + e y ). Moltiplicazione 2 x(1 + e x ) y(1 + e y ) = x y(1 + e x )(1 + e y ) x y(1 + e x + e y ) Quindi l errore nel prodotto è dato da e xy = e x + e y Divisione (con y 0) x(1 + e x ) y(1 + e y ) = x y (1 + e x)(1 e y + e 2 y +...) x y (1 + e x e y ) Si ha e x/y = e x e y : gli errori si accumulano additivamente Addizione (e, analogamente, Sottrazione) x(1 + e x ) + y(1 + e y ) = x + y + xe x + ye y = (x + y)(1 + x x + y e x + y x + y e y) L errore è e x+y = x e y. x x + y e x + y x + y e y, una combinazione lineare che dipende da xy > 0 = e x+y e x + e y xy < 0 = x x + y e y possono essere molto grandi e, in tal caso, ci x + y sarà un amplificazione notevole dell errore. Si ha il fenomeno di cancellazione se non si fa attenzione al numero di cifre significative dei numeri che vengono sommati. Esempio [Sull uso delle cifre significative] Sia x = 0.1103 e y = 0.009963. Se consideriamo un sistema decimale a 4 cifre, y, normalizzato, viene scritto e memorizzato come 0.9963 10 2. Facendo la sottrazione di questi due numeri, abbiamo 0.1103 10 0 0.9963 10 2 = 0.1103 0.009963 = 0.100337. Facendo l arrotondamento a 4 cifre abbiamo il valore 0.1003. 0.100337 0.1003 L errore relativo che commettiamo è:.37 10 3. Questo 0.100337 errore è minore della precisione di macchina (considerata la base 10 e le 4 cifre) 1 2 10 3. Tuttavia, se non teniamo conto delle cifre significative ma tronchiamo i numeri alle prime 4 cifre, abbiamo la sottrazione di 0.1103 0.0099 = 0.1004. 2 nei conti si trascurano le potenze maggiori o uguali a due per e x e e y

5. Propagazione degli errori 11 0.100337 0.1004 Questa volta l errore relativo è.63 10 3. L errore è maggiore della precisione di macchina. 0.100337 Esempio [Il disastro del missile Patriot ] Nel 1991 un missile Patriot fallì l operazione di inseguire e fermare uno Scud, in Arabia Saudita, a causa di un problema di precisione numerica. Come conseguenza, lo Scud uccise 28 americani. Il computer usato per controllare il missile Patriot era basato su un aritmetica a 24 bit. Per i calcoli, il tempo veniva registrato dall orologio interno del sistema in decine di secondi e successivamente moltiplicato per 1/10 per ottenere i secondi, utilizzando 24 bit in virgola fissa. Il numero 1/10 in base 2 ha infinite cifre decimali: la sua espansione binaria è infatti 0.0001100110011001100110011001100.... In 24 bit esso veniva registrato come 0.00011001100110011001100 introducento un errore di 0.0000000000000000000000011001100..., circa 0.000000095 in base 10. Gli errori di arrotondamento nella conversione del tempo causarono un errore nel calcolo della traiettoria. Difatti, il tempo di 100 ore calcolato in secondi diede il valore 359999.6567 invece di 360000, un errore di 0.3433 secondi che portò il Patriot 687 metri fuori della traiettoria del missile Scud! Esempio [Sul fenomeno di cancellazione] Consideriamo il problema di approssimare la derivata della funzione f(x) = sin x nel punto x = 1.2. Supponiamo di non poter valutare direttamente la derivata della f e di volerla approssimare facendo uno sviluppo in serie di Taylor: Allora f(x 0 + h) = f(x 0 ) + hf (x 0 ) + h2 2 f (x 0 ) + h3 6 f (x 0 ) + h4 24 f IV (x 0 ) +... f (x 0 ) = f(x 0 + h) f(x 0 ) h ( h 2 f (x 0 ) + h2 6 f (x 0 ) + h3 24 f IV (x 0 ) +...) Approssimiamo, quindi, la f (x 0 ) calcolando f(x 0 + h) f(x 0 ). h L errore di discretizzazione che si commette è f (x 0 ) f(x 0 + h) f(x 0 ) = h h 2 f (x 0 ) + h2 6 f (x 0 ) + h3 24 f IV (x 0 ) +... Supponendo di conoscere il valore della derivata seconda in x 0, per piccoli valori di h possiamo dare una stima dell errore di discretizzazione, f (x 0 ) f(x 0 + h) f(x 0 ) h h 2 f (x 0 )

5. Propagazione degli errori 12 Ci aspettiamo, anche senza conoscere il valore di f (x 0 ) (purchè diverso da 0) che l errore di discretizzazione diminuisca proporzionalmente con il passo h, al decrescere di h. Nel nostro caso, in cui f(x) = sin (x), noi conosciamo il valore esatto della derivata in 1.2, vale a dire cos (1.2) = 0.362357754476674... Il valore che otteniamo approssimando la derivata con la formula che abbiamo ricavato, per h = 0.1 non è molto accurato. Ci aspettiamo che diminuendo il passo h l errore che commettiamo diminuisca. Riportiamo gli errori della formula (in valore assoluto) e confrontiamoli con l errore di discretizzazione h 2 f (x 0 ) (i conti sono fatti in singola precisione): h errore h 2 f (x 0 ) 1.e-1 4.7167e-2 4.6602e-2 1.e-2 4.6662e-3 4.6602e-3 1.e-3 4.6608e-4 4.6602e-4 1.e-4 4.6603e-5 4.6602e-5 1.e-5 4.6602e-6 4.6602e-6 1.e-6 4.6597e-7 4.6602e-7 L errore commesso dall algoritmo decresce come h e, in particolare, come h 2 f (1.2) = 0.46602h. Possiamo pensare di ottenere un accuratezza grande quanto vogliamo a condizione di prendere valori di h sempre più piccoli. In realtà, per valori di h molto piccoli, gli errori iniziano ad aumentare! h errore h 2 f (x 0 ) 1.e-8 4.3611e-10 4.6602e-9 1.e-9 5.5947e-8 4.6602e-10 1.e-10 1.6697e-7 4.6602e-11 1.e-11 4.6603e-5 4.6602e-12 1.e-12 1.3006e-4 4.6602e-13 1.e-13 4.2505e-4 4.6602e-14 1.e-16 3.6236e-1 4.6602e-16 1.e-18 3.6236e-1 4.6602e-19 In figura 1 vediamo come la curva dell errore inizialmente segue la retta descritta dall errore di discretizzazione ma poi si allontana da essa. Perchè questo diverso comportamento per valori di h molto piccoli? L errore che noi valutiamo è dato dalla somma dell errore di discretizzazione e dell errore di arrotondamento. Per valori di h grandi, l errore di discretizzazione descresce al diminuire di h e domina l errore di arrotondamento. Ma quando l errore di discretizzazione diventa molto piccolo, per valori di h minori di 10 8, allora l errore di arrotondamento inizia a dominare

5. Propagazione degli errori 13 Figura 1: La curva tratteggiata -. rappresenta l errore di discretizzazione, la curva rappresentata come -o è la curva dell errore computazionale che si ha approssimando f (x 0 ) con il rapporto incrementale f(x 0 + h) f(x 0 ). h 10 0 10 5 Errore assoluto 10 10 10 15 10 20 10 25 10 20 10 15 10 10 10 5 10 0 passo h e ad aumentare sempre più al diminuire di h. Questo è un motivo per cui si deve richiedere ad un algoritmo che l errore di discretizzazione sia quello che debba prevalere. Nell errore di arrotondamento, per h via via più piccoli, si verifica un errore di cancellazione: f(x 0 + h) è praticamente uguale a f(x 0 ) per h molto piccoli! per cui l errore che calcoliamo è f (x 0 ) 0 = f (x 0 ) = 0.3623577544... Una strategia per evitare la cancellazione è di scrivere diversamente la differenza f(x 0 + h) f(x 0 ). Nel caso di f(x) = sin (x) ricorriamo alla formula trigonometrica per cui sin (φ) sin (ψ) = 2 cos ( φ + ψ ) sin ( φ ψ ). 2 2 Vediamo come migliorano le cose inserendo nel grafico di prima la curva dell errore che otteniamo utilizzando questa espressione trigonometrica. L errore continua a diminuire anche quando la formula precedente inizia a dare un errore crescente. Nel grafico 2 abbiamo anche considerato la curva dell errore di arrotondamento in modo da confrontare l andamento effettivo con un limite superiore teorico dell errore computazionale totale dato dalla somme degli errori di discretizzazione e di arrotondamento. La rappresentazione di f(x) è affetta da errore per cui avremo: f(x) = f (x) + e x. L errore di arrotondamento è f(x 0 + h) f(x 0 ) = f (x 0 + h) f (x 0 ) + e x 0 +h e x0. h h h Maggiorando e x con la precisione di macchina ɛ, l errore di arrotondamento è dato da 2ɛ/h. Esempio [Sempre sul fenomeno di cancellazione]

5. Propagazione degli errori 14 Figura 2: La curva tratteggiata -. rappresenta l errore di discretizzazione, la curva continua - l errore dovuto all arrotondamento, la curva rappresentata come -o è la curva dell errore computazionale che si ha approssimando f (x 0 ) con il rapporto incrementale f(x 0 + h) f(x 0 ), mentre la curva rappresetata da - h + è la curva dell errore che si commette applicando al rapporto incrementale la formula trigonometrica per cui f(x 0 + h) f(x 0 ) = sin (x 0 + h) sin (x 0 ) = 2 cos (2x 0 + h/2) sin (h/2). 10 5 10 0 10 5 Errore assoluto 10 10 10 15 10 20 10 25 10 20 10 15 10 10 10 5 10 0 passo h Sia da risolvere l equazione x 2 56x + 1 = 0 in una macchina a 5 cifre decimali. Applicando la formula x 1/2 = b ± b 2 4ac all equazione ax 2 + bx + c = 0, 2a abbiamo x 1/2 = 28 ± { 0.01786284073 783 = 28 ± 27.98213716 =. 55.98213716 Consideriamo la macchina a 5 cifre decimali. x 1 = 28 783 =.28 10 2.27982 10 2 = 0.00018 10 2 = 0.018 x 2 = 28 783 =.28 10 2 +.27982 10 2 = 0.55982 10 2 = 55.982 La radice x 2 è arrotondata correttamente, mentre la variabile x 1 no, per effetto della cancellazione. Possiamo però scrivere x 1 x 2 = 1 da cui x 1 = 1/x 2 = 1/0.55982 10 2 = 1.7862 In aritmetica di macchina non valgono più la proprietà distributiva o associativa del prodotto.

6. Instabilità e malcondizionamento 15 Esempio [Sulla proprietà distributiva e associativa] Vediamo come non valga più la relazione (a b) 2 = a 2 2ab + b 2. Sia a = 15.6 e b = 15.7 e la macchina sia a 3 cifre decimali. (a b) = (a b) + e a b. Abbiamo (a b) = 15.6 15.7 = 0.1. Quindi (a b) 2 = +0.01 = 0.1 10 1. Consideriamo ora a 2 2ab + b 2 = 243.36 489.84 + 246.49 =.24336 10 3.48984 10 3 +.24649 10 3 Considerando la macchina a 3 cifre decimali, abbiamo:.243 10 3.490 10 3 +.246 10 3 = 0.1 10 1 I risultati sono completamente diversi! 6 Instabilità e malcondizionamento 6.1 Instabilità In generale è impossibile evitare un accumulo lineare degli errori di arrotondamento durante un calcolo, ed è accettabile che ci sia una crescita lineare moderata, del tipo E n c 0 ne 0 dove E n misura l errore relativo dell n-sima operazione dell agoritmo e c 0 sia una costante non molto grande. Se invece avviene una crescita di tipo esponenziale E n c n 1 E 0 allora l algoritmo è instabile. Algoritmi del genere devono essere evitati! Definiamo, quindi, un procedimento numerico instabile se gli errori che vi sono associati non rimangono limitati ma crescono fino a distruggere completamente la soluzione. Esempio Consideriamo l integrale 1 x n y n = x + 10 dx 0 per valori di n = 1, 2,..., 30. Osserviamo che, poichè x [0, 1], la funzione integranda varia pure essa nell intervallo [0, 1] per cui 0 < y n < 1. Analiticamente, si ha: y n + 10y n 1 = 1 Vale anche la relazione 0 x n + 10x n 1 x + 10 y 0 = 1 0 dx = 1 0 x n 1 (x + 10) x + 10 1 dx = ln 11 ln 10. x + 10 dx = 1 0 x n 1 dx = 1 n

6. Instabilità e malcondizionamento 16 Possiamo pensare, quindi, di calcolare numericamente il valore di y n attraverso il seguente algoritmo: 1. valutare y 0 = ln 11 ln 10 2. per n = 1, 2,..., 30 valutare y n = 1 n 10y n 1 Questa formula ricorsiva dovrebbe dare l esatto valore se non fossero presenti errori di arrotondamento. I numeri che generiamo, infatti, tendono a zero mentre l errore si moltiplica. Infatti y 1 = 1 10y 0 y 2 = 1 2 10(1 10y 0) = 1 2 10 102 y 0 y 3 = 1 3 10(1 2 10 102 y 0 ) = 10 3 y 0 + costante...... y n = 10 n y 0 + costante n L algoritmo quindi, considerati gli errori di arrotondamento, presenta un errore E n con crescita di tipo esponenziale. Difatti otteniamo valori che via via si allontanano dall intervallo di ammissibilità [0, 1]. Abbiamo infatti (in doppia precisione con un codice Matlab): n y n 0 9.5310e-2 1 4.6898e-2 2 3.1018e-2 3 2.3154e-2 4 1.8465e-2...... 7 1.1481-2 8 1.0194e-2 9 9.1673e-3 10 8.3270e-3 18-9.1694e+1 27-9.1699e+9 30-9.1699e+13 Se facciamo un programma in Fortran che descrive lo stesso algoritmo abbiamo invece i risultati (con valori crescenti ma diversi):

6. Instabilità e malcondizionamento 17 n y n 0 9.5310e-2 1 4.6898e-2 2 3.1021e-2 3 2.3122e-2 4 1.8778e-2...... 7-3.0229e-1 8 3.1479e+0 9-3.1368e+1 10 3.1378e+2 18 3.1377e+10 27-3.1377e+19 30 3.1377e+22 Se invece, considero y n 1 = 1 10 ( 1 n y n), partendo da un valore di n molto grande e andando a ritroso, l errore diminuisce. Perciò, dato un valore di accuratezza ɛ > 0 e fissato un intero n 0 è possibile determinare l intero n 1 tale che, partendo da y n1 = 0 e andando a ritroso, gli integrali y n saranno valutati con un errore in valore assoluto minore di ɛ per 0 < n n 0. Infatti: y n0 = 0 y n0 1 = 1 1 10 n 0 y n0 2 = 1 10 ( 1 n 0 1 1 1 ) = 1 10 n 0 10 2 costante 2 1 y n = 10 n 0 n costante n 0 n 1 L errore al passo n dipende, quindi, da 10 n 0 n. Se richiediamo una tolleranza ɛ = 10 6, per calcolare y n1 allora dovrà essere Passando al logaritmo in base 10: 1 10 n 0 n 1 < ɛ = 10 n 1 n 0 < ɛ n 1 n 0 < log ɛ = n 0 > n 1 log ɛ Per n 1 = 20 si ricava n 0 = 26. Questa volta i calcoli danno gli stessi risultati sia in Matlab sia in Fortran:

6. Instabilità e malcondizionamento 18 n y n 26 0.000000 25 3.84615e-3 24 3.61538e-3 23 3.80513e-3 22 3.96731e-3 21 4.14872e-3 20 4.34703e-3 19 4.56530e-3 18 4.80663e-3 17 5.07489e-3 16 5.37486e-3 15 5.71251e-3 14 6.09542e-3 13 6.53332e-3 12 7.03898e-3 11 7.62944e-3 10 8.32797e-3 9 9.16720e-3 8 1.01944e-2 7 1.14806e-2 6 1.31377e-2 5 1.53529e-2 4 1.84647e-2 3 2.31535e-2 2 3.10180e-2 1 4.68982e-2 0 9.53102e-2 Osserviamo come il valore y 0 coincida con il valore teorico noto. L esempio appena visto ci porta a dare alcune considerazioni sui criteri su cui si deve basare un algoritmo: un algoritmo deve essere accurato, efficiente e robusto, accurato nel senso che bisogna essere in grado di sapere la grandezza dell errore che si commette nell algoritmo stesso; efficiente in termini di velocità di esecuzione e di richiesta di spazio di memoria per le variabili utilizzate; robusto nel dare il risultato corretto entro un livello di tolleranza dell errore che sia accettabile. 6.2 Malcondizionamento Un problema si dice malcondizionato se a piccole variazioni nei dati di input del problema corrispondono forti variazioni nei dati di output. Quando il problema è, dunque, molto sensibile alle variazioni dei dati di input, producendo risultati molto

6. Instabilità e malcondizionamento 19 diversi tra loro, allora nessun algoritmo, per quanto robusto e stabile, potrà dare una soluzione robusta al problema stesso. Esempio [Sui polinomi] Sia p(x) il polinomio di grado n, p(x) = x n + a n 1 x n 1 +... + a 1 x + a 0, con a 0 0. Si vogliono trovare le radici del polinomio p(x). I dati di input sono dunque i coefficienti a i, i = 0, n 1 del polinomio mentre i dati di output sono le radici del polinomio. Sia ξ una radice del polinomio. Essa sarà funzione dei coefficienti a i, quindi scriveremo ξ = f(a 0, a 1,..., a n 1 ). Perturbiamo, ora, uno dei coefficienti, ad esempio a k con a k + a k e vediamo come variano le radici del polinomio perturbato rispetto a quello di partenza, considerando il rapporto f f dove f = f(a 0, a 1,..., a k + a k,..., a n1 ) f(a 0, a 1,..., a k,..., a n1 ) Supponendo a k sufficientemente piccolo, si può approssimare f con lo sviluppo in serie di Taylor troncato al primo termine, cioè f = a k. f a k Perciò f f a f k a k f = a k a = k a k f f a k La variazione sulle radici f f è dunque proporzionale alla variazione sui dati di f ingresso a a k k a mediante il coefficiente k. a k f Calcoliamo questa quantità. Scriviamo il polinomio come: ξ n + a n 1 ξ n 1 +... + a k x k +... + a 0 = 0 vale a dire f(a 0, a 1,..., a n 1 ) n + a n 1 f(a 0, a 1,..., a n 1 ) n 1 +... + a k f(a 0, a 1,..., a n 1 ) k +... + a 0 = 0 Ho un identità nelle variabili a 0, a 1,..., a n 1. Anche la derivata parziale rispetto ad a k sarà, perciò, un identità a zero: n f a k f(a 0, a 1,..., a n 1 ) n 1 + a n 1 (n 1) f a k f(a 0, a 1,..., a n 1 ) n 2 +...+ a k k f f(a 0, a 1,..., a n 1 ) k 1 + f(a 0, a 1,..., a n 1 ) k f +... + a 1 = 0 a k a k la derivata del termine a k f(...) k

6. Instabilità e malcondizionamento 20 Da questa relazione ricaviamo: f a k (nξ n 1 + a n 1 (n 1)ξ n 2 +... + a k kξ k 1 +... + a 1 ) = ξ k f a k p (ξ) = ξ k f a k = ξk p (ξ) Andando a sostituire otteniamo: f f f a k = a k f a k a k = a kξ k a k ξp (ξ) a k Se il coefficiente a kξ k ξp è grande in valore assoluto, allora a piccole variazioni (ξ) sul coefficiente a k si avranno grandi variazioni nella radice ξ. Ciò, si verifica, ad esempio, quando le radici sono in modulo molto vicine tra loro. Supponiamo di avere il polinomio p(x) = (x 1)(x 2) (x 10). Chiaramente, tale polinomio ha radici 1, 2,..., 10. Se perturbiamo il polinomio variando il coefficiente a 9 del valore 0.0001, considerando cioè il polinomio p(x) + 0.0001x 9 allora le radici corrispondenti a 7, 8, 9, 10 non saranno più reali ma avranno anche una parte immaginaria. Quindi un piccolo cambiamento nel coefficiente a 9, da -55 a -54.9999 porta a grandi cambiamenti in alcune delle radici del polinomio.