Regole del gioco e aritmetica del calcolatore
Transcript
Regole del gioco e aritmetica del calcolatore
Carla Guerrini 1 Regole del gioco e aritmetica del calcolatore L’insieme dei numeri rappresentabili esattamente su di un calcolatore sono chiamati numeri macchina essi possiedono un numero finito di cifre (o figure) generalmente questo insieme viene indicato con F e chiamato anche insieme dei numeri floating point. Per esempio i numeri 31.415926 e −0.0000456 possono essere scritti come 3.1415926 × 101 , 0.0031415926 × 104 , e −4.56 × 10−5 , 456 × 10−7 , in questo modo il punto decimale si sposta, floats, e varia l’esponente della potenza della base 10. In modo simile un numero macchina x ∈ F ha la seguente forma: Ã ! a1 a2 at x=s× + 2 + . . . t × βp β β β ove s é il segno, β é la base di numerazione utilizzata e la stringa di t cifre a1 a2 a3 . . . at é chiamata mantissa e p é l’esponente. Inoltre ogni cifra ai per t = 1, 2, . . . , t vale 0 ≤ ai ≤ β − 1 mentre p é intero e varia in un prefissato intervallo L ≤ p ≤ U . La maggior parte dei calcolatori utilizza la base β = 2. E’ noto il seguente risultato fondamentale sulla rappresentazione dei numeri reali: Proposizione 1. Ogni numero reale α 6= 0 puó essere espresso in modo univoco nella forma che segue: α = sign(α)(a1 β −1 + a2 β −2 + a3 β −3 + . . .)β p = sign(α)( ∞ X ai β −i )β p := sign(α)mβ p . (1) i=1 ove sign(α) = 0 se α > 0, sign(α) = β − 1 se α < 0. Il numero intero β > 1 é detto base della rappresentazione. Il numero intero p si chiama esponente di α, mentre l’intero β p é detto parte esponente di α. Le cifre ai sono numeri interi che verificano le condizioni: 0 ≤ ai < β ∀i, a1 6= 0, (2) Il numero reale m > 0 é detto mantissa di α: m := a1 β −1 + a2 β −2 + a3 β −3 + ... = ∞ X ai β −i (3) i=1 e soddisfa le condizioni β −1 ≤ m < 1. (4) A causa della sua capacitá finita, un calcolatore non é in grado di rappresentare 2010/02/23 2 tutto l’insieme dei numeri reali. Si pone pertanto il problema di definire, per ogni x ∈ R una sua rappresentazione approssimata nel calcolatore. Si tratta, in sostanza, di un fatto tecnico, ma con importanti implicazioni nel calcolo numerico. Se la base di numerazione β é pari i sistemi di calcolo fanno uso dell’arrotondamento alla t-esima cifra significativa, esso si ottiene aggiungendo β/2 alla t + 1-esima cifra e troncando la mantissa cosı́ ottenuta alla t−esima cifra, m + β2 β −(t+1) i.e. m + 12 β −t , indichiamo F(β, t, L, U ) l’insieme dei numeri rappresentati su un calcolatore e sia α ∈ R la sua rappresentazione f l(α) ∈ F sará f lT (α) = f l(α) = Pt ±( i=1 ai β −i )β p Pt+1 ai β −i + β2 β −(t+1) )β p = ±0.aˆ1 . . . ât × β p̂ (5) Per effetto dell’arrotondamento si possono avere nuove cifre âi che comunque verificano 0 ≤ âi < β ∀i = 1, . . . , t con aˆ1 6= 0 Esempio β = 10, t = 4 f lA (α) = ±f lT ( α = 17.850, α = 17.854, α = 17.855, α = 17.859, i=1 f lt (α) = 17.85 f lt (α) = 17.85 f lt (α) = 17.85 f lt (α) = 17.85 = f lA (α). = f lA (α). , f lA (α) = 17.86 , f lA (α) = 17.86 Numeri finiti consecutivi Dato il reale α, siano x ed y due numeri finiti entrambi con mantissa a t cifre e consecutivi (ossia non ci sono numeri finiti tra x e y a t cifre) tali che x≤α<y α = ±0.a1 a2 . . . at−1 at at+1 . . . ×β p x = ±0.a1 a2 . . . at−1 at ×β p y = ±0.a1 a2 . . . at−1 (at + 1) ×β p Consideriamo il punto medio M = (x + y)/2 dell’intervallo [x, y]. Risulta f lT (α) ≡ x, f lA (α) ≡ { x se α < M y se α ≥ M 2010/02/23 3 Esempio Sia β = 10, t = 5, e sia α = 27.1827 allora f lT (α) = 27.182, f lA (α) = 27.183. 27.181 27.182 27.183 27.181 27.182 27.183 Si puó osservare che quando un numero viene arrotondato il massimo errore che si puó compiere nel caso in cui la base sia 10 é di 0.5 · 10−t , mentre nel caso di troncamento l’errore puó essere di 10−t . É importante tener conto degli errori che inevitabilmente si introducono quando si utilizza un sistema di calcolo specialmente quando si lavora con dati approssimati. Arrotondare o troncare negli altri sistemi di numerazione diversi dal sistema decimale é completamente analogo. Insieme dei Numeri Finiti I simboli β,e t, numeri interi che denotano la base e le cifre della mantissa sono tali che β ≥ 2, t ≥ 1. Si suppone che p appartenga ad un intervallo (range) di estremi L e U per cui L ≤ p < U . I quattro parametri β, t, L, U individuano l’ insieme dei numeri finiti con cui si opera. tale insieme viene qui indicato con F(β, t, L, U ) base β con t cifre significative, l’insieme: P {α ∈ R : α = sign(α)β p ti=1 ai β −i , F(β, t, L, U ) = {0} ∪ con 0 ≤ ai < β, per i = 1, 2 . . . , t, a1 = 6 0, L ≤ p ≤ U }. Si può domostrare che F(β, t, L, U ) è costituito da - il numero finito zero, f l(0); - (β −1)β t−1 (U −L+1) numeri finiti positivi non uniformemente distribuiti nell’intervallo [β L−1 , β U [; - (β−1)β t−1 (U −L+1) numeri finiti negativi non uniformemente distribuiti nell’intervallo ] − β U , −β L−1 ]; Questo insieme finito di numeri sostituisce nella pratica gli infiniti numeri reali appartenenti all’intervallo ] − β U , β U [ 2010/02/23 4 Esempio Consideriamo l’insieme F(2, 3, L, U ) cioé β = 2, t = 3, da cui deriva il seguente insieme di numeri: {0.100 · 2p , 0.101 · 2p , 0.110 · 2p , 0.111 · 2p } dove 0.100, 0.101, 0.110, 0.111 sono tutte le possibili mantisse e p il valore dell’esponente. 4 7 Sono rappresentati gli intervalli per p = −1 : [ 16 , 16 ], p = 0 : [ 48 , 78 ], p = 1 : 4 7 [ 4 , 4 ], . . .. In F(2, 3, −1, 2) si contano 16 numeri positivi non uniformemente distribuiti in [β L−1 , β U ] = [2−2 , 22 [= [ 14 , 4[ 4 0.100 × 2−1 = 12 × 12 = 14 = 16 ; ... ... 5 0.101 × 2−1 = ( 12 + 18 ) × 21 = 16 ; ... ... 6 = 16 0.110 × 2−1 = ( 12 + 14 ) × 21 ... ... 7 0.111 × 2−1 = ( 12 + 14 + 81 ) × 12 = 16 ; 2 0.100 × 2 = 12 × 4 = 2 = 48 ; 0.100 × 20 = 12 × 1 = 12 0.101 × 22 = ( 21 + 18 ) × 4 0.101 × 20 = ( 12 + 18 ) × 1 = 85 ; 0.110 × 22 = ( 21 + 14 ) × 4 0.110 × 20 = ( 12 + 14 ) × 1 = 86 ; 0.110 × 22 = ( 21 + 14 + 18 ) × 4 0.110 × 20 = ( 12 + 14 + 81 ) × 1 = 78 ; Risulta evidente l’aumento dell’ampiezza degli intervalli definiti dal valore p , in ognuno dei quali vengono localizzati i 4 valori della mantissa; ne risulta di conseguenza una diradazione delle suddivisioni verso gli estremi sinistro e destro della retta reale. Come si evince dalla rappresentazione dei numeri −7 4 −2 −7 8 −1 −7 16 −1 −1 2 4 7 16 0 1 4 1 2 7 8 ... ... ... = 42 ; = 52 ; = 62 ; = 72 ; 7 4 1 appartenenti a F(2, 3, −1, 2) sull’asse reale - essi non sono uniformemente distribuiti - la loro densità decresce con l’aumentare del valore assoluto del numero. - in ogni intervallo [β q , β q+1 ] essi sono in ugual numero ed uniformemente distribuiti. Tutto l’insieme F(2, 3, −1, 2) contiene 33 numeri finiti: 16 negativi,zero e 16 positivi. Esercizio Rappresentate sulla retta reale l’insieme dei numeri che appartengono alla macchina F(2, 3, −2, 3), confrontate i risultati ottenuti con l’esempio precedente Esercizio Rappresentate sulla retta reale l’insieme dei numeri che appartengono alla macchina F(2, 4, −1, 2), confrontate i risultati ottenuti con l’esempio precednte. 2 2010/02/23 5 function [num]=numeri_floating_point(t,L,U) % grafica sull’asse reale i numeri di macchina % F(2,t,L,U) j=1; num=[]; s(j)=2^(-1);m=2^(t-1); for j=2:m s(j)=s(j-1)+2^(-t); end num(1)=0; esp=[L:1:U] n=length(esp); for i=1:n num=[num,s*2^esp(i)]; end num=[-fliplr(num),num]; figure(1);hold on lun=length(num);y=[-.1,.1]; ma=max(num) for k=1:lun r=[num(k),num(k)]; plot(r,y,’b’) end axis equal, grid Underflow e Overflow Se il numero reale non nullo α = ±(0.a1 a2 a3 . . . at at+1 . . .)β p t̀ale che L≤p≤U a1 6= 0, ai = 0 per i>t allora α ∈ F (β, t, L, U ), ossia appartiene all’insieme dei numeri finiti F(β, t, L, U ). Se α ∈ / F (β, t, L, U ) si pone il problema di associare in modo adeguato ad α un numero f l(α). Si possono presentare due casi di non appartenenza: • p∈ / [L, U ] – se p < L si associa zero ad α e dal sistema viene generalmente segnalata la situazione di underflow; – se p > U ,α non viene rappresentato e dal sistema viene generalmente segnalata la situazione di overflow; • l’esponente p ∈ [L, U ], ma α ∈ / F(β, t, L, U ) perchè le sue cifre ai per i > t non sono tutte nulle; in questo caso si associa ad α un numero finito f l(α) per troncamento oppure per arrotondamento. Esempio Sia F(10, 3, −5, 5), α = 98273 f lT (α) = 0.982 × 105 ; f lA (α) = 0.983 × 105 α = 99960 f lT (α) = 0.999 × 105 f lA (α) = 1.0 × 105 = 0.1 × 106 overf low 2010/02/23 6 Esempio Sia F(10, 3, −1, 2), α = 1/8 f lT (α) = 0.100 × 2−2 , underf low, f lA (α) = 0.100 × 2−1 . Rappresentazione in Memoria I bit disponibili per la memorizzazione di un numero finito vengono suddivisi tra le t cifre della mantissa e l’esponente p che può assumere U − L + 1 configurazioni diverse, più un bit per il segno del numero. esponente mantissa segno Nel caso della rappresentazione binaria, sarà sempre a1 = 1, per cui può essere sottointeso senza mai essere fisicamente rappresentato. La normalizzazione della mantissa permette di sfruttare al meglio le cifre disponibili, evitando di rappresentare esplicitamente gli 0 non significativi. Ad esempio 0.000124 viene rappresentato come .124 · 10−3 . La virgola quindi non ha una posizione fissa tra la parte intera e quella non, ma varia; é detta floating-point o a virgola mobile. La mantissa mt viene quindi rappresentata in t − 1 bits. Non viene riservato alcun segno per l’esponente, ma esso viene memorizzato per traslazione (BIASED). Illustriamo la tecnica con un esempio. Supponiamo di lavorare con un calcolatore che utilizza la base β = 10 e otto locazioni di memoria suddivise come segue: un bit per il segno s di f l(α), 0 per il segno + e 9 per il segno −, S p_1 p_2 a_1 a_2 a_3 a_4 a_5 due celle per l’esponente p e cinque celle per la rappresentazione in base 10 di mt . Dato il numero +0.1039 × 10−5 , il punto decimale non viene rappresentato (é sottointeso che si trovi prima delle cifre 1039) il segno positivo é rappresentato dalla cifra decimale 0, la mantissa é data dalle cinque cifre decimali 10390 resta da rappresentare l’esponente p = −5. Dato che si hanno a disposizione due cifre decimali, l’esponente potrebbe essere rappresentato come un intero con segno −9, −8, . . . , −1, 00, 01, 02, . . . , 9 Per avere un range di numeri più vasto si utilizza la traslazione. Si osserva che la metà dei numeri rappresentabili in base β con r locazioni di memoria è dato r da β2 Nel nostro esempio β = 10, r = 2, quindi β r /2 = 50. 2010/02/23 7 Definiamo un bias per la traslazione, esso corrisponde al valore che dobbiamo sommare all’esponente per ottenere il numero che viene rappresentato βr sull’elaboratore 2 Nel nostro caso il bias vale 50. Quindi i possibili esponenti rappresentabili con la traslazione sono r r − β2 ≤ p ≤ β2 − 1 Gli esponenti effettivi vengono cosı̀ traslati: l0 esponente − 50 → l0 esponente − 49 → .. .. . . 0 l esponente − 2 → l0 esponente − 1 → 00 01 .. . l0 esponente 0 l0 esponente 1 .. . → → .. . 50 51 .. . 48 l0 esponente 48 → 98 49 l0 esponente 49 → 99 Esempio Nell’insieme dei numeri macchina F(10, 5, −50, 49) il numero α = 0.1039 × 10−6 verrà cosı̀ memorizzato: 04410390, α = 0.05302 → 04953020 α = −237.141 → 95323714 α = −0.00321665 → 94832167 Lo standard IEEE IEEE floating point standard é l’insieme di regole stabilite dal Institute di Electrical and Electronics Engineers sulla rappresentazione e il processamento dei numeri floating point sui computer. Lo standard ha 4 obiettivi principali: • rendere l’aritmetica piú accurata possibile • produrre risultati sensibili in situazioni eccezionali • stadardizzare le operazioni floating point su computer diversi • fornire il controllo al programmatore della gestione di eccezioni Il primo punto viene raggiunto in due modi: lo standard specifica esattamente come un numero floating point deve essere rappresentato nel hardware, per cui la portabilità del codice risulta facilitata, cosı̀ sará possibile eseguire lo stesso programma su differenti architetture ottenendo gli stessi risultati. Lo standar introduce ”inf” (infinito ∞) per indicare che il risultato é piú grande del piú grande numero rappresentabile, e introduce N aN (Not a Number) per idicare che il risultato non ha alcun senso. Prima di questo standard molti computer eseguivano un ”abort” del programma in queste circostanze. Una conseguenza del terzo punto riguarda la possibilitá di trasportare su altri computer il codice in binario senza perdita di precisione e senza informazioni aggiuntive sulla conversione in rappresentazione decimale e formato ASCII. Una proposta di standard fu presentata nel 1979, ma solo nel 1985, dopo varie modifiche, è stato adottato (ANSI/IEEE std 754-1985) e implementato su diversi microprocessori (fra i primi INTEL8087 e Motorola 68881). Lo standard definisce quattro formati (rappresentazioni binarie) floating-point ripartiti in due gruppi, BASIC ed EXTENDED, ciascuno con due precisioni, SINGLE e DOUBLE. I dettagli del formato EXTENDED sono lasciati all’implementatore e vengono fatte delle richieste di minima. 2010/02/23 8 • Basic Single - 32 bit : 1 bit per il segno, 8 bit per l’esponente, 23 bit per la mantissa • Basic Double - 64 bit : 1 bit per il segno, 11 bit per l’esponente, 52 bit per la mantissa. • Extended Single - 44 bit : 1 bit per il segno, almeno 11 bit per l’esponente, almeno 32 bit per la mantissa. • Extended Double - 79 bit : 1 bit per il segno, almeno 15 bit per l’esponente almeno 63 bit per la mantissa. Per una trattazione approfondita rimandiamo alla bibliografia • IEEE: Institute for Electrical and Electronics Engineer; • ANSI: American National Standards Institute • SIAM: Society for Industrial and Applied Mayhematics • Michael L. Overtone, Numerical Computing with IEEE floating point arithmetic, edizione SIAM,2001, http://www.cs.nyu.edu/faculty/overtone/book/ • consultare i link alle revisioni dello standard IEEE 754. Rappresentazione IEEE di un Reale Ogni numero reale α 6= 0 viene espresso, in modo univoco nel seguente modo: α = ±(a0 β 0 + a1 β −1 + a2 β −2 + a3 β −3 + . . .)β p ∞ X = ±( ai β −i )β p = ±mβ p i=0 La base β = 2, l’esponente p ≥ 0 le cifre ai assumono i valori 0 o 1: 0 ≤ ai < 2 ∀i, a0 = 1, il numero reale m > 0 è la mantissa di α e soddisfa le condizioni 1≤m<2 Quindi nella forma scientifica (differisce dalla precedente perchè la cifra più significativa è a0 = 1): α = ±1 • a1 a2 . . . × 2p In altre parole nello standard IEEE normalizzato il bit più significativo sta a sinistra del punto radice e non viene memorizzato. È necessaria una rappresentazione speciale per lo zero: • tutti i bit dell’esponente sono 0 • & • tutti i bit della mantissa sono 0 2010/02/23 9 r L’esponente più piccolo L = − β2 + 1 = pmin è riservato per lo zero. In modo analogo l’esponente più grande è riservato per le rappresentazioni speciali. Questo riduce di due unità il numero dei possibili esponenti rappresentabili per traslazione. Nel formato BASIC SINGLE (28 /2 = 128) f l(α) = ±1 • a1 a2 . . . a23 × 2p − 127 < p < 128 Nel formato BASIC DOUBLE (211 /2 = 1024) f l(α) = ±1 • a1 a2 . . . a52 × 2p − 1023 < p < 1024 Rappresentazioni Speciali Nello standard IEEE lo zero non è l’unico numero che ha una rappresentazione speciale, altre rapp. speciali sono introdotte per gestire situazioni eccezionali, per dare la possibilità di continuare il processo durante il quale si sono generate queste condizioni speciali: • ±∞ nel caso di divisione per zero, il risultato viene memorizzato nel numero ∞ (viene visualizzato inf ) e il processo può continuare • Not a Number (NaN); non è un numero, ma un pattern di bit che segnala un errore, e.g. 0/0; ∞ − ∞ o qualcosa che non ha senso; • numeri non normalizzati (o denormalizzati), che permettono il cosı̀ detto underflow graduale, riempiono in modo uniforme il gap tra lo zero ed il primo numero finito a destra dello zero hanno la forma f l(α) = ±0 • 00 . . . 0ak ak+1 . . . at−1 × 2pmin Nel caso in cui il valore v di un numero f l(α) sia in formato BASIC precisione SINGLE: a. se p = 255 ed m 6= 0 allora v = N aN (Not A Number) b. se p = 255 ed m = 0 allora v = (−1)s ∞ (Infinity) c. se 0 < p < 255 allora v = (−1)s (1.m) × 2p−127 d. se p = 0 e m 6= 0 allora v = (−1)s (0.m) × 2p−128 (Not Normalized) 2010/02/23 10 Il valore N aN (Not a Number) è usato per rappresentare un valore che non rappresenta un numero reale. Esistono due categorie di N aN : QN an (Quiet NaN) e SN aN (Signally NaN). QN an è un N aN con il bit più significativo della frazione uguale a 1 e si propaga liberamente attraverso la maggior parte delle operazioni. Questo valore salta fuori da una operazione quando il risultato non è matematicamente definito. SN aN è un N aN con il bit più significativo della frazione azzerato. È usato per segnalare una eccezione in operazioni, per esempio quando si usano prematuramente variabili non inizializzate. Semanticamente QN aN denota operazioni indeterminate, mentre SN aN denotano operazioni non valide Arrotondamento ai pari Dato un numero reale α 6= 0 lo standard IEEE definisce il modo corretto di calcolare il numero finito f l(α), viene usato l’arrotondamento ai pari (round to nearest), tra f lT (α) e f lA (α) si sceglie quello più vicino ad α. α = ±0 • a1 a2 . . . at at+1 . . . × 2p si distinguono una serie di casi: • at+1 = 0 (in questo caso è più vicino a f lT (α)) f l(α) = f lT (α) • at+1 = 1 & at+2 = 1 (in questo caso è più vicino a f lA (α)) f l(α) = f lA (α) • at+1 = 1 & ai = 0 ∀i > t + 1 (caso di equidistanza) si calcolano f lT (α) e f lA (α) a t cifre. Quello dei due che ha at = 0 (cioé quello dei due che è pari) viene scelto come f l(α). Precisione e cifre significative Se t è il numero di figure della mantissa mt espressa in base β, il corrispondente numero di figure della mantissa espressa in base 10 é pari a |log10 β −t |, • nel formato IEEE basic single t = 23 + 1, |log10 2−24 | ≈ 7.22472 cioè la precisione IEEE singola corrisponde ad una rappresentazione finita con circa 7 cifre decimali significative. 2010/02/23 11 • nel formato IEEE basic double t = 52 + 1, |log10 2−53 | ≈ 15.9546 cioè la precisione IEEE doppia corrisponde ad una rappresentazione finita con circa 16 cifre decimali significative. 2010/02/23 12 • La corrispondenza tra cifre (significative) binarie e decimali si calcola come segue log10 (2) ≈ 0.30103, log2 (10) ≈ 3.32193 1 cifra decimale ≈ 3.3 cifre binarie. Utilizzate il seguente sito per analizzare come viene rappresentato un reale nello standard IEEE: http://babbage.cs.qc.edu/IEEE-754/ 2010/02/23 13 Unitá di Arrotondamento Dato l’insieme dei numeri finiti F (β, t, L, U ) si dice unitá di arrotondamento e lo si indica con u la quantitá ( u= β (1−t) per 1 (1−t) β per 2 troncamento arrotondamento • In troncamento, u è detto gap tra il numero finito 1 ed il numero finito successivo • In arrotondamento u è dato dalla metà del gap tra il numero finito 1 ed il numero finito subito successivo. Esempio Il formato IEEE basic single u={ β 1−t = 2−23 ≈ 1.19209 × 10−7 1 1−t β = 2−24 ≈ 5.96046 × 10−8 2 troncamento arrotondamento si riconferma il fatto che la precisione IEEE singola corrisponde a 7 cifre decimale significative. Il formato IEEE basic Double u={ β 1−t = 2−52 ≈ 2.22045 × 10−16 1 1−t β = 2−53 ≈ 1.11022 × 10−16 2 troncamento arrotondamento si riconferma il fatto che la precisione IEEE singola corrisponde a 16 cifre decimale significative. 2010/02/23 14 Nota u è il più piccolo numero finito positivo tale che f l(u + 1) > 1 0 1/4 1/2 1 { Nota Nel caso di arrotondamento ai pari, u è il più grande numero finito positivo tale che f l(u + 1) = 1 u 5/4 Errori di rappresentazione L’insieme dei numeri finiti rappresenta solo un ristretto sottoinsieme di quello dei numeri reali. La maggior parte dei valori α ∈ R risulta ∈ / F(β,t,L,U ) , quindi tali valori possono essere solamente approssimati mediante una function che abbiamo indicato con f l(α) ∈ F(β,t,L,U ) , commettendo un certo errore. Per valutarne l’entità si definisco le seguenti quantità: |α − f l(α)| errore assoluto ¯ ¯ ¯ α − f l(α) ¯ ¯ ¯ ¯ ¯ se α 6= 0 ¯ ¯ α errore relativo La rappresentazione discreta della retta reale descritta in precedenza è tale che fornisce un errore relativo di rappresentazione massimo costante per ogni α, mentre quello assoluto, di conseguenza, aumenta proporzionalmente al valore di α. Banalmente si deduce che l’entità più informativa è l’errore relativo in quanto l’errore assoluto dipende da α; per cui, nella pratica, quando possibile si usa sempre l’errore relativo. 2010/02/23 15 Teorema Per ogni α ∈ R risulta: |α − f lT (α)| < β p−t 1 |α − f lA (α)| ≤ β p−t 2 dove il segno di uguaglianza vale solo se at+1 = β2 e at+i = 0 per i ≥ 2. Dimostrazione Siano x e y i due numeri finiti consecutivi tali che x ≤ α < y; ove x = βp t X ai β −i i=1 p t X y=β ( ai β −i + β −t ) i=1 allora poiché f lT (α) = x sará α − f lT (α) < y − x = β p−t e ancora poiché ( f lA (α) = x se α < y se α ≥ sará |α − f l(A (α)| ≤ | x+y 2 x+y 2 1 x−y | = β p−t 2 2 e l’uguaglianza vale solo se α = x+y cioé at+1 = β2 e at+1 = 0 per i ≥ 2. 2 Esempio Se il numero reale α = 1234567 e si utilizza l’insieme F(10, 3, L, U ) sará f l(α) = 1230000 = 0.123 ∗ 107 , l’errore assoluto |α − f l(α)| = 4567 valore molto grande, mentre l’errore relativo |α − f l(α)| = 0.369 ∗ 10−2 |α| Se invece α = 0.1234567 ∗ 10−2 sará f l(α) = 0.123 ∗ 10−2 l’errore assoluto |α − f l(α)| = 0.4567 ∗ 10−5 valore molto piccolo, e l’errore relativo |α − f l(α)| = 0.369 ∗ 10−2 α lo stesso di prima. Quindi nelle ipotesi di α 6= 0 l’indicatore piú appropriato in entrambi i casi é l’errore relativo. 2010/02/23 16 Teorema Per ogni α ∈ R e α 6= 0 vale la seguente limitazione | α − f l(α) |≤u α sia nel caso di troncamento sia nel caso di arrotondamento. Dimostrazione α = β p (a1 β −1 + a2 β −2 + . . .) ≥ β p a1 β −1 ≥ β p−1 e quindi α − f l(α) α − f l(α) |≤| | α β p−1 dal teorema precedente segue che | α − f l(α) | |≤ α β p−t = β p−1 1/2β p−t β p−1 β 1−t troncamento = 12 β 1−t arrotondamento. Il segno di uguaglianza in quest’ultima si puó avere se e solo se at+1 = β2 e at+2 = 0 i ≥ 2, ma in tal caso risulterebbe α ≥ β p (a1 β −1 + at+1 β −t−1 ) > β p a1 ≥ β p−1 . c.v.d. Corollario Per ogni α ∈ R e α 6= 0 vale f l(α) = α(1 + ²) con |²| < u. Dimostrazione banalmente se si definisce ²= f l(α) − α α dal teorema si ha che |²| < u e f l(α) = α(1 + ²). Osservazione I Se nel corollario si fosse definito ² = α−fαl(α) si sarebbe ottenuto f l(α) = α(1 − ²) con |²| < u. Osservazione II Procedendo come nel teorema visto si puó dimostrare che se f l(α) 6= 0 α − f l(α) | < u; | f l(α) l(α) α e definendo ² = α−f vale f l(α) = 1+² con |²| < u, e definendo ² = f l(α)−α f l(α) f l(α) α vale f l(α) = 1−² con |²| < u. L’insieme F é dunque completamente caratterizzato dalla base β, dal numero di cifre significative t e dall’intervallo (L, U ) di variabilitá dell’esponente: F(β, t, L, U ). In Matlab si utilizza l’insieme F(2, 53, −1021, 1024), in effetti 53 cifre significative in base 2 corrispondono alle 16 cifre significative mostrate in base 10 da Matlab con il format long. L’inevitabile errore che si commette sostituendo ad un numero reale x 6= 0 il suo rappresentante in F, che indichiamo con f l(x) é generalmente piccolo perché l’errore relativo 1 |x − f l(x)| ≤ ²M |x| 2 (6) 2010/02/23 17 dove ²M = β 1−t rappresenta la distanza fra 1 ed il piú vicino numero floating point diverso da 1. Si osservi che ²M dipende da β e da t. In Matlab ²M é memorizzato in eps si ha ²M = 2−52 ≈ 2.2210−16 . Si osservi che nella (6) si stima l’errore relativo su x, certamente piú significativo dell’errore assoluto |x − f l(x)| , quest’ultimo infatti non tiene conto dell’ordine di grandezza di x. Essendo L e U finiti non si potranno rappresentare numeri in valore assoluto arbitrariamente piccoli o grandi. Di fatto, il piú piccolo ed il piú grande numero positivo di F sono: xmin = β L−1 , xmax = β U (1 − β −t ). In Matlab attraverso i comandi realmin e realmax é possibile determinare tali valori che sono: xmin = 2.225073858507201e − 308 xmax = 1.797693134862316e + 308 Un numero positivo inferiore a xmin produce una segnalazione di underf low e viene trattato come 0. Un numero positivo maggiore xmax produce una segnalazione di overf low e viene memorizzato nella variabile Inf . Il fatto che xmin e xmax siano gli estremi di un intervallo molto vasto della retta reale non deve trarre in inganno, i numeri di F sono molto addensati vicino a xmin diventano sempre piú radi all’avvicinarsi di xmax . Il numero immediatamente precedente a xmax e immediatamente successivo a xmin sono rispettivamente: x− max = 1.7976931348623157e + 308 + xmin = 2.2250773858507202e − 308 (7) −323 292 dunque x+ , mentre xmax −x− . La distanza relativa min −xmin ≈ 10 max ≈ 10 resta sempre comunque piccola come si deduce dalla (6). Consideriamo le operazioni elementari fra i numeri di F, esse non godono di tutte le proprietá delle analoghe operazioni definite su R. Restano valide la commutativitá fra gli addendi o fra fattori, precisamente f l(x + y) = f l(y + x) e f l(xy) = f l(yx) ma vengono violate l’unicitá dello zero la proprietá associativa e distributiva. Per renderci conto della non unicitá dello zero assegnamo ad una variabile a un valore, per esempio 1, ed eseguiamo il seguente codice: À a = 1; À b = 1; À while a + b ∼= a; b = b/2; end In questo codice, la variabile b viene dimezzata ad ogni passo finché la somma di a con b si mantiene diversa da a. E’ evidente che se stessimo usando i numeri reali, il programma non si arresterebbe mai, invece si arresta dopo un numero finito di passi e fornisce per b il valore 1.1102e − 16 = ²M . Quindi esiste almeno un numero b diverso da zero tale che a + b = a, ció accade per la struttura dell’insieme F, che é costituito da elementi isolati. 2010/02/23 18 Per quanto riguarda la proprietá associativa, essa viene violata quando si presenta una situazione di overflow o di underflow: prendiamo per esempio a = 1.0e + 308, b = 1.1e + 308,e c = −1.001e + 308 ed eseguiamo la somma in due modi diversi. Troviamo: a + (b + c) = 1.0990e + 308, (a + b) + c = Inf. Quando si sommano tra loro numeri quasi della stessa grandezza in modulo, ma diversi in segno, il risultato puó essere assai impreciso, questa situazione viene chiamata cancellazione di cifre significative. Ad esempio consideriamo in Matlab la seguente operazione: ((1 + x) − 1)/x con x 6= 0, il cui risultato esatto é 1 per ogni x 6= 0, troviamo invece: À x = 1.e − 15; ans = 1.1102 ((1 + x) − 1)/x Come si nota il risultato é molto inaccurato nel senso che l’errore assoluto é grande. Un altro esempio di cancellazione numerica si incontra nella valutazione della funzione f (x) = x6 − 6x5 + 15x4 − 20x3 + 15x2 − 6x + 1 che corrisponde al polinomio (x − 1)6 . Se valutiamo le due forme in 200 punti equispaziati nell’intervallo [1−2∗10−8 , 1+2∗10−8 ] si ottiene il seguente grafico −15 8 x 10 y=x.6−6*x.5+15*x.4−20*x.3+15*x.2−6*x+1 y3=(x−1).6 6 4 2 0 −2 −4 −6 0.996 0.997 0.998 0.999 1 1.001 1.002 1.003 1.004 1.005 Un altro esempio é costituito dalla seguente successione r z1 = 2, zi+1 = 2i−1/2 1 − q 1 − 41−i zi2 , i = 2, 3, . . . 2010/02/23 19 errore relativo per il calcolo di π 0 10 −2 10 −4 10 −6 10 −8 10 −10 10 0 5 10 15 20 numero di iterazioni 25 30 la quale converge a π quando n tende a ∞. Se utilizziamo MATLAB per calcolare zn , troveremo che l’errore relativo fra π e zn decresce per 16 iterazioni per poi cominciare a crescere a causa degli errori di arrotondamento Ossevazioni Gli errori di arrotondamento sono generalmente piccoli, tuttavia se ripetuti all’interno di algoritmi lunghi e complessi, possono avere effetti catastrofici. Esistono esempi di disastri reali causati da errori di tipo numerico si veda il sito INSTITUTE for Mathematics and its APPLICATIONS del prof. Douglas Arnold che tiene dei corsi di Grafica e dei corsi avanzati di Analisi Numerica http://www.ima.umn.edu/∼ arnold/disasters/disasters.html Due casi eclatanti: nel 1996 l’esplosione del missile Arianne della European Space Agency esploso dopo 40 secondi dalla partenza costato 7 miliardi di dollari. É risultato, dalle indagini successive, che la caduta fu dovuta a un errore software nel sistema inerziale di riferimento. Piú precisamente un numero floating point a 64 bit contenente la velocitá orrizzontale del vettore rispetto alla piattaforma fu convertito in intero a 16 bit con segno. Il numero era piú grande di 32767, (il piú grande intero memorizzabile in 16 bit con segno) e quindi la conversione fallı́ il razzo mutó direzione bruscamente si spensero i motori ed esplose. Nel 1991 durante la guerra del golfo un missile patriot cadde su una caserma americana a causa di un errore di arrotondamento nel calcolo del tempo dal momento del lancio. Il tempo in decimi di secondo come viene misurato dal clock interno fu moltiplicato per 10 per avere il tempo in secondi. Questo calcolo fu eseguito usando un registro a 24 bit fisso. 2010/02/23 20 Il valore 1/10 che ha una espansione binaria non finita fu troncato a 24 bit dopo il punto radice. Il piccolo errore di chopping quando venne moltiplicato per un grande numero per ottenere il tempo in secondi diede luogo ad un errore 1 significativo. La batteria di Patriot rimase attiva per 100 ore. Il numero 10 equivale a: 1 1 1 1 1 1 + 5 + 8 + 9 + 12 + 13 + . . . 4 2 2 2 2 2 2 1 in altre parole l’espansione binaria di 10 é 0.0001100. Ora il registro a 24 bit del patriot memorizzó 0.00011001100110011001100 introducendo un errore di 0.00000000000000000000000110011001100 . . . che equivale circa a 0.000000095 in decimale, che moltiplicato per il numero di decimi di secondo in 100 ore fornisce: 0.000000095 × 100 × 60 × 60 × 10 = 0.34 Un missile Scud viaggia a circa 1676 metri al secondo, quindi percorre piú di mezzo kilometro in questo tempo. Ció fu sufficiente per portare lo scud fuori dalla finestra di intercettazione del patriot. 2010/02/23 21 Aritmetica Finita Per ogni operazione aritmetica +, −, ×, / è necessario definire una equivalente operazione ⊕, ª, ⊗, ® in virgola mobile, in modo che ∀x, y numeri finiti valgano x ⊕ y = f l(x + y) x ª y = f l(x − y) x ⊗ y = f l(x × y) x ® y = f l(x/y) in parole: il numero finito x⊕y risultato di una operazione in aritmetica finita, deve coincidere con il troncamento/arrotondamento (eseguito secondo le regole dell’aritmetica finita) del numero reale x+y calcolato in aritmetica esatta. Dal corollario 1. si ha che ∀x, y ∈ F(β, t, L, U ) f l(x + y) = (x + y)(1 + ²), f l(x − y) = (x − y)(1 + ²), f l(x × y) = (x × y)(1 + ²), f l(x/y) = (x/y)(1 + ²), |²| < u |²| < u |²| < u |²| < u Analisi degli Errori I problemi nascono quando si eseguono una successione di operazioni, ove ad ogni passo, vengono utilizzati come input i valori precedentemente calcolati. In questo caso si verifica una propagazione degli errori la cui entità molto spesso è tutt’altro che trascurabile. Il controllo e la gestione di tale fenomeno risulta fondamentale in tutte le applicazioni informatiche che implementano in modo approssimato modelli matematici teorici, al fine di determinare l’attendibilità dei risultati ottenuti. La teoria della propagazione degli errori fornisce alcuni strumenti di base per questo scopo. Consideriamo due spazi vettoriali normati, di dimensione finita su R, • X: spazio dei dati iniziali di dimensione n • Y: spazio dei risultati (output) di dimensione m consideriamo il problema f di cui si vuole conoscere il risultato f (z) nel punto z = (z1 , z2 , . . . , zn )T ∈ X Sia q un algoritmo o metodo che si usa per risolvere il problema. f :X→Y problema q : X → Y z ∈ X dato di input ( per esempio z ∈ F(β, t, L, U )) z̃ ∈ X dato di input perturbato (esempio z̃ = f l(z)) δz = z̃ − z perturbazione sul dato di input z metodo 2010/02/23 22 Analisi in avanti : Data una funzione esatta f (x) per ogni suo coefficiente ed operazione si introduce un fattore d’errore relativo che rappresenta l’approssimazione introdotta dall’aritmetica finita e si ricava una corrispondente funzione approssimata q(x). La differenza |f (x) − q(x)| fornisce un’indicazione sull’entità dell’errore totale che affligge la valutazione di f (x). f f(x) q q(x) x Analisi all’indietro : Consiste nel considerare il risultato finale q(x) come risultato esatto derivato da dati iniziali perturbati rispetto a quelli reali. La valutazione dell’entità dell’errore è data quindi da un fattore δx sul dato iniziale x tale che f (x + δx) = q(x). x q q(x) x+dx f −1 Esempio di analisi all’indietro Somma di due numeri finiti x, y q(x, y) = f l(x + y) = (x + y)(1 + ²) = x(1 + ²) + y(1 + ²). Questo risultato puó essere visto come risul tato esatto della somma dei due dati (x + dx) e (y + dy) ove dx = ²x e dy = ²y. Applicando l’analisi in avanti alle quattro operazioni aritmetiche si ottengono alcuni importanti risultati: Siano x, y ∈ R • moltiplicazione f l(f l(x)f l(y))−xy 2 )(1+²3 )−xy = x(1+²1 )y(1+² xy xy +²1 ²3 +²2 ²3 +²1 ²2 ²3 )−xy = xy+xy(²1 +²2 +²3 +²1 ²2xy ' ²1 + ²2 + ²3 < 3u dove |²1 |, |²2 |, |²3 | < u e le semplificazioni sono ottenute conducendo un’analisi del primo ordine, nell’ipotesi realistica che gli errori ²i siano dell’ordine della precisione di macchina u, che è un valore molto più piccolo di 1, è ragionevole condurre un’analisi dell’errore del primo ordine, cioè trascurare il contributo dei termini non lineari negli errori ²i . 2010/02/23 23 Risulta una propagazione lineare degli errori, per cui l’operazione di moltiplicazione è stabile. • divisione f l(f l(x)/f l(y))−x/y x/y = x(1+²1 ) (1+²2 ) (1+²3 )−x/y y x/y = (1 + ²1 )(1 + ²2 )(1 + ²3 ) − 1 ' ²1 + ²2 + ²3 < 3u Stesso risultato della moltiplicazione. • addizione e sottrazione = f l(f l(x)±f l(y))−(x±y) x±y [x(1+²1 )±y(1+²2 )](1+²3 )−(x±y) x±y y x ' x±y ²1 ± x±y ²2 + ²3 Nel caso dell’addizione (sottrazione) di due numeri x, y con segno concorde (discorde) l’errore finale è maggiorato da 3u. Altrimenti non è possibile dare una maggiorazione dell’errore relativo indipendente da x, y. In particolare se (x ± y) → 0 la limitazione dell’errore risulta molto elevata. In questi casi, l’elevato errore che si può ritrovare nel risultato non è generato dall’operazione aritmetica in floating-point (infatti l’errore locale dell’operazione ²3 ha modulo minore di u), ma è dovuto alla presenza degli errori relativi non nulli ²1 , ²2 su x, y che sono amplificati dalle operazioni aritmetiche di addizione e sottrazione. Tale fenomeno viene definito di cancellazione numerica ed è senza dubbio la conseguenza più grave della rappresentazione con precisione finita dei numeri reali. Esempio Sia F(10,6,L,U ) con rappresentazione per arrotondamento e siano dati i numeri reali x = 0.147554326 ed y = −0.147251742. La loro approssimazione nell’insieme F sarà: f l(x) = 0.147554 e f l(y) = 0.147252. L’addizione esatta darà: x + y = 0.302584 × 10−3 , mentre in aritmetica finita darà: f l(f l(a) + f l(b)) = 0.302000 × 10−3 . L’errore relativo commesso sarà: ² ' 0.2 × 10−2 , mentre u = 0.5 × 10−5 comportando un grave errore. Esempio Confrontiamo due algoritmi che forniscono una stima di e−10 che si basano sulla stima di x2 x3 x4 + + + ... ex = 1 + x + 2! 3! 4! • I. algoritmo si pone x = −10 e per n ≥ 0 viene stimata la somma parziale: sn = 1 − 10 + 10n 102 103 − . . . + (−1)n 2! 3! n! 2010/02/23 24 • II. algoritmo si pone x = 10 e si approssima il valore di e−10 per ogni n ≥ 0 con 1 1 e−10 = 10 ' 2 n 10 e 1 + 10 + 2! + . . . + 10n! Nella figura vengono messi a confronto gli errori relativi commessi con una precisione di macchina eps ' 2.210−16 . Nella figura sottostante si osserva che i risultati piú accurati sono ottenuti con il secondo algoritmo perché non sono presenti cancellazioni approssimazione di e−10 10 10 algoritmo I algoritmo II 5 10 0 errore relativo 10 −5 10 −10 10 −15 10 −20 10 0 10 20 30 n 40 50 60 % confronto fra due algoritmi per il calcolo di e^(-10) x=-10;exx(1)=1;ex(1)=1; for i=2:60 ex(i)=ex(i-1)*x/(i-1); exx(i)=(-1)^(i-1)*ex(i); end for i=1:60 sum_ex(i)=sum(ex(1:i)); sum_exx(i)=1./(sum(exx(1:i))); end r_ex=abs(sum_ex-exp(-10))/exp(-10); r_exx=abs(sum_exx-exp(-10))/exp(-10); semilogy(j,r_ex,’.-’,j,r_exx); legend(’algoritmo I’,’algoritmo II’) xlabel(’n’),ylabel(’errore relativo’) title(’approssimazione di e^{-10}’) 2010/02/23 25 Problemi e Metodi di risoluzione Per valutare la bontà del risultato non basta capire come vengono propagati gli errori dal metodo ( la funzione o metodo q), occorre capire anche la reazione del problema stesso alla introduzione di perturbazioni sul dato z. Occorre capire come gli errori inevitabili dovuti alla rappresentazione finita vengono propagati dal problema (funzione f)in assenza di altri errori che si hanno durante il calcolo. Errori Propagati dal Problema Confrontare le risposte f (z) ed f (z̃), entrambe analitiche ma ottenute a partire da dati di input z originari e z̃ perturbati serve a giudicare la bontà della f proposta a modellare il problema in esame. Un problema è ben condizionato se vale z̃ ≈ z ⇒ f (z̃) ≈ f (z) Errori Propagati dal Metodo Spesso non si hanno a disposizione i dati di input z ma una loro approssimazione z̃. La funzione analitica f fornirà la risposta f (z̃). Un buon metodo q ha come obiettivo f (z̃) e cerca di soddisfare l’idea dell’analisi all’indietro. Un metodo q è stabile se vale f (z̃) ≈ q(z) per z ≈ z̃ Errore Inerente, Algoritmico e Analitico Le funzioni effettivamente calcolabili su un computer sono solo le funzioni razionali, il cui valore è ottenuto mediante un numero finito di operazioni aritmetiche. Le funzioni non razionali, come ad esempio le trigonometriche, possono solo essere approssimate da opportune funzioni razionali. Data funzione f : Rn → Rm i dati di input z = (z1 , z2 , . . . zn ) comprendono le variabili e i coefficenti numerici che definiscono f . Ogni funzione è composta da una parte simbolica, rappresentata esattamente, ed una numerica. Ad esempio la rappresentazione di una retta è data dalla sua equazione simbolica y = mx + b cioè i coefficenti m, b. In questo caso il vettore dati di input è (x, m, b) dove x è la variabile indipendente. • errore nei dati Sia z 6= 0 si definisce errore nei dati di input come l’errore relativo kz̃ − zk Edati = kzk • errore inerente: o errore inerente al problema dovuto agli errori sui dati di input e al modo in cui la f modella il problema stesso Ein = k f (z̃) − f (z) k f (z) • errore algoritmico: errore del metodo, dovuto alle operazioni in aritmetica finita ed al tipo e ordine di svolgimento delle operazion fissate dal metodo q. q(z̃) − f (z̃) k Ealg = k f (z̃) 2010/02/23 26 • errore analitico: errore generato quando la funzione f (x) non è razionale, per cui viene approssimata con una funzione razionale (Per esempio il 2 3 4 calcolo di e−x si può ottenere da ex = 1 + x + x2! + x3! + x4! + . . .) Teorema Siano z e z̃ tali che f (z) 6= 0 e f (z̃) 6= 0. Si definisce l’errore relativo totale q(z̃) − f (z) k Etot = k f (z) Etot = Ealg (1 + Ein ) + Ein = Ein + Ealg + Ealg Ein . (8) Dimostrazione Tralasciando i moduli possiamo scrivere Etot = q(z̃) −1 f (z) ⇒ Etot + 1 = q(z̃) , f (z) per le stesse ragioni possiamo scrivere che Ein + 1 = f (z̃) , f (z) e Ealg + 1 = q(z̃) f (z̃) posso allora moltiplicare e dividere per la stessa quantitá: Ã Etot + 1 = q(z̃) f (z) !Ã f (z̃) f (z̃) ! Ã = q(z̃) f (z̃) !Ã f (z̃) f (z) f (z̃) f (z̃) allora: ! = (Ealg + 1) (Ein + 1) da cui il risultato. Se Ein ≈ O(u) e Ealg ≈ O(u) è ragionevole condurre una analisi della propagazione dell’errore al primo ordine. La tesi del teorema diventa allora Etot = Ein + Ealg Se f (x) è differenziabile in un intorno di x si ha che Ein ' n X ci ²i i=1 dove ci = xi ∂f (x) f (x) ∂xi i e |²i | < u, per i = 1, 2, . . . , n I coefficienti ci sono detti coefficienti con ²i = x˜ix−x i di amplificazione e danno una misura di quanto influisce l’errore relativo ²i da cui è affetto il dato xi sul risultato. Se i coefficienti ci sono di modulo elevato anche piccoli errori ²i inducono grossi errori su f (x), in questo caso il calcolo di f (x) è detto malcondizionato. I coefficienti ci dipendono unicamente dalla f (x). L’errore algoritmico Ealg , invece, è generato dal calcolo della funzione q(z̃) come composizione di un numero finito di operazioni di macchina: l’analisi del primo ordine permette di esprimere Ealg come combinazione lineare degli errori locali generati dalle singole operazioni. Se n é il numero di operazioni svolte, possiamo approssimare al primo ordine 2010/02/23 27 Ealg < θn (z)u + O(u2 ) in cui θ(z) è una funzione indipendente da u e O(u2 ) è una funzione di u di ordine maggiore o uguale al secondo. Si può quindi semplificare: Ealg < θn (z)u • Se θn (z) = cn la crescita dell’errore é lineare, una crescita lineare é normale, non é pericolosa, in tal caso il metodo é stabile. • Se θn (z) = cn , c > 1, in questo caso la crescita é esponenziale, é una crescita insostenibile, quindi l’algoritmo é instabile. Se la funzione f (z) non è razionale, è necessario approssimarla con una funzione razionale g(z): tale approssimazione introduce l’errore analitico Ean = kg(z) − f (z)k kf (z)k Con procedimenti equivalenti a quelli usati in precedenza risulta che Etot ' Ein + Ean + Ealg Indice di Condizionamento Si vuole definire un numero che da solo dia indicazioni sul condizionamento buono o cattivo di un problema f ( e quindi su come il problema stesso propagherà l’errore) Per misurare il condizionamento di f confrontiamo Edati con l’errore inerente. Ein Kf (z, z̃) = Edati cioè Kf (z, z̃) = k z kf (z̃) − f (z)k kzk f (z̃) − f (z) kk k= f (z) z̃ − z kz̃ − zk kf (z)k Vogliamo modificare la definizione di Kf (z, z̃) = in modo che dipenda solo da z e non da z̃. Cioè si vuole una definizione del numero di condizione che non dipenda dalla perturbazione sui dati di input. Possiamo (z)k come rapporto incrementale vettoriale, e di vedere il termine kf (z̃)−f kz̃−zk sostituirlo con lo Jacobiano. Definizione di Jacobiano Se f : Rn → Rm ed è differenziabile, possiamo definire la matrice m × n jacobiana Jf (z) = [Jij ] = [ ∂fi (z) ] i = 1, . . . , m, j = 1, . . . , n ∂zj Lo Jacobiano può essere considerato per una f : Rn → Rm , 2010/02/23 28 come l’analogo multidimensionale della derivata prima f 0 (x) di una funzione f : R → R derivabile rispetto a x. Numero di Condizione Se f è differenziabile, si ha la seguente definizione del numero di condizione del problema f relativo al punto z: Kf (z) = kJf (z)k kzk kf (z)k maggiore è il valore di Kf (z) peggiore è il condizionamento del problema e quindi il modo in cui propagherá l’errore. Vale la seguente maggiorazione Ein ≤ Kf (z)Edati Se Kf (z, z̃) ≤ 1 allora possiamo concludere che l’errore relativo sul risultato é inferiore o uguale all’errore sui dati ( problema ben condizionato). Se Kf (z, z̃) >> 1 piccole perturbazioni sui dati possono indurre perturbazioni amplificate nel risultato (problema mal condizionato) f f(x) x x+dx f f(x+dx) 2010/02/23 29 Esempi e Problemi mal condizionati Dagli esempi precedenti risulta che: per uno stesso problema esistono procedimenti di risoluzione che producono errori algoritmici diversi. Si è anche visto che, indipendentemente dall’algoritmo usato, esiste un errore inerente, intrinseco al problema, che non può essere controllato. Vediamo alcuni esempi Esempio Uno dei classici problemi geometrici che può risultare mal condizionato è il calcolo del punto di intersezione di due rette, in particolare l’amplificazione dell’errore risulta proporzionale al loro grado di parallelismo. I polinomi in gioco sono del tipo p(x) = q + mx. Se viene introdotto un errore solo nel parametro m Nel caso dell’intersezione è fondamentale che la valutazione delle due rette sia affidabile in prossimità dei punti d’intersezione. Tale condizione si ottiene traslando l’ origine proprio nell’intorno di questi, ma per poterlo fare bisognerebbe conoscerli a priori. Nella figura si osserva come una piccola variazione del coefficiente angolare provoca grossi errori nel calcolo del’intersezione, mentre con le stesse rette, rappresentate con l’origine coincidente con il punto d’intersezione, non si ha nessun errore. Si noti inoltre che le rette sono state volutamente costruite in modo che siano prossime al parallelismo, condizione che amplifica gli errori di rappresentazione. Infatti, lo stesso esempio, con rette quasi-ortogonali produce un errore finale molto più contenuto. Esempio É dato il problema di calcolare l’espressione (o funzione): √ √ f (x) = x1 + x2 − x1 Si puó osservare che per |x2 | << |x1 | si incorre in un errore di cancellazione e quindi di instabilitá del procedimento ( se x1 , x2 sono numeri 2010/02/23 30 √ √ finiti, non lo saranno x1 e x2 ). Quindi si cerca un algoritmo differente che eviti questo problema. Nel caso in questione razionalizzando si ha: √ √ √ √ x1 + x2 + x1 f (x) = ( x1 + x2 − x1 ) √ √ = x1 + x2 + x1 x1 + x2 − x1 x2 =√ √ =√ √ x1 + x2 + x1 x1 + x2 + x1 L’espressione cosı́ trovata é esente da errorii di cancellazione, infatti al denominatore si effettua una somma, mentre l’operazione pericolosa é stata eseguita analiticamente. Si osservi peró che per x1 + x2 → 0 anche la versione stabile da risultati scadenti. Analizziamo il condizionamento del problema ossia l’errore inerente, per quanto visto é Ein ' c1 E1 + c2 E2 ; ci = xi δf (x) · f (x) δxi facendo i conti si ottiene s x1 1 ), c1 = ( 2 x1 + x2 1 c2 = − (1 + 2 s x1 ) x1 + x2 ove si nota che quando x1 + x2 → 0 il problema risulta mal condizionato. Illustriamo la situazione con esempi numerici: indichiamo con y il valore esatto con y1 e y2 rispettivamente i risultati dei due algoritmi visti utilizzando una aritmetica con 7 cifre significative 1 −3 – x1 = 0.1 × 10 q , x2 = 0.1 × 10 1 x1 c2 = 2 (1 + x1 +x2 ) ' 1 condizionamento buono. y = 0.4999875 × 10−6 Y1 = 0.4994869×10−6 instabile infatti |x2 | << |x1 | Y2 = 0.4999875× 10−6 2010/02/23 31 – x1 = 1, x2 = −1 + 10−6 c2 ' 12 103 malcondizionato perché x1 + x2 → 0 y = −0.9990000 Y1 = Y2 = −0.9985858 entrambi gli algoritmi danno risultati scadenti – x1 = 0.1, x2 = 0.1 c2 ' 0.85 condizionamento buono y = Y1 = Y2 = 0.1309858 entrambi gli algoritmi danno risultati buoni. Dagli esempi precedenti risulta che per uno stesso problema esistono procedimenti di risoluzione che producono errori algoritmici differenti. Si è anche visto che, indipendentemente dall’algoritmo usato, esiste un errore inerente, intrinseco al problema, che non può essere controllato. Limitazioni dell’indagine La teoria sulla propagazione dell’errore, pur essendo fondamentale per capire l’essenza del problema, presenta molti limiti che la rendono inutilizzabile nella maggior parte dei casi concreti. Primo fra tutti, la pesantezza del procedimento con cui si ricava l’espressione dell’errore. Si è visto nei vari esempi come anche esami su semplici funzioni, ben definite, comportino una notevole quantità di calcoli. Pensando ad un software composto da varie centinaia di funzioni che dipendono in modo complesso l’una dall’altra si capisce come una analisi del genere sia impraticabile. Un ulteriore limite è dovuto al fatto che le equazioni ricavate rappresentano una maggiorazione dell’errore, e quindi una previsione pessimistica. Gli errori che si verificano nell’esecuzione reale delle varie operazioni possono risultare decisamente più ridotti, e quindi essere mal rappresentati dai valori massimi calcolati. Valutazioni dell’errore più aderenti ai calcoli reali si possono ottenere usando metodi che seguono i vari passi di esecuzione a run-time, considerando i valori numerici effettivamente in gioco. L’indecidibilità dell’eguaglianza dei numeri floating-point Una conseguenza delle approssimazioni che immediatamente deve essere considerata nella stesura di codice, è il diverso significato che assume l’operatore di eguaglianza tra due numeri floating-point. Nella quasi totalità dei casi l’eguaglianza intesa come perfetta identità di tutti i bit che rappresentano due numeri f.p. a, b non è affidabile. Esempi Il calcolo della soluzione di un’equazione f (x) = 0 è uno dei più importanti problemi della matematica applicata. In generale non sono disponibili formule esplicite per calcolare la soluzione, per cui si deve ricorre a metodi iterativi che convergono ad essa mediante una successione {xi } di approssimazioni successive. 2010/02/23 32 L’iterazione viene terminata in base ad opportuni criteri d’arresto, uno di questi è dato dalla relazione |f (xi )| < ² (9) dove ² non può essere scelta arbitrariamente piccola, perchè, a causa degli errori di arrotondamento, la condizione potrebbe non essere mai soddisfatta. Come già visto, può essere che a+b=b con a 6= 0 I valori numerici rappresntati su un calcolatore sono approssimati é quindi necessario definire un criterio di eguaglianza a meno di un errore ², ad esempio a=b se |a − b| < ² (10) Questo approccio è utile praticamente, ma formalmente, usando dei numeri floating-point, equality for real numbers is not decidable with constructive means . Questa affermazione è confermata nei seguenti termini piuttosto intuitivi: dati due numeri floating-point a e b, pur disponendo di una maggiorazione dell’errore assoluto ² su di essi, risulta che: • se |a − b| > ² si può affermare con sicurezza che a 6= b • se |a − b| ≤ ² non si può affermare con sicurezza né che a = b né che a 6= b.