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.