Appunti di Calcolo Numerico Lezione1 Numeri Reali e Numeri Finiti: la propagazione degli errori L’impiego di un calcolatore permette di effettuare operazioni elementari fra numeri in tempi molto brevi offrendo la possibilità di risolvere problemi molto più complicati mediante l’esecuzione di algoritmi complessi, costituiti da operazioni elementari. Tuttavia il calcolatore, essendo una macchina finita, è costretto ad operare con numeri rappresentati da un numero finito di cifre; ne consegue che in genere un numero reale introdotto nel calcolatore viene approssimato. Si pensi, ad esempio, ai numeri π o √2 che hanno un numero infinito di cifre. Se si eseguono, poi, operazioni elementari sui numeri finiti si possono ottenere risultati non più rappresentabili esattamente dal calcolatore. Questo significa che eseguendo un algoritmo su un calcolatore si ha, in generale, una creazione e propagazione degli errori. Quindi, il risultato prodotto dall’algoritmo differisce dal risultato esatto cioè da quel risultato che si otterrebbe idealmente lavorando con tutte le cifre richieste. Il controllo degli errori introdotto dall’uso dei numeri finiti è molto importante al fine di determinare l’attendibilità dei risultati ottenuti. 1 1. Rappresentazione dei Numeri Naturali: basi di Rappresentazione Si consideri il sistema decimale per la rappresentazione dei numeri naturali. Un numero intero positivo N viene espresso nella forma N = d n ⋅ 10 n + d n −1 ⋅ 10 n −1 + ...... + d 1 ⋅ 101 + d 0 ⋅ 10 0 e rappresentato, mediante notazione posizionale, come N = d n d n −1......d1d 0 dove le cifre di , 0 ≤ i ≤ n , sono numeri interi compresi tra 0 e 9. Es. il numero naturale 425, nel sistema decimale è espresso nella forma: 425 = 400 + 20 + 5 =4*102 + 2*101 +5*100 Nel sistema decimale si è scelta come base il numero 10. Considerando un sistema avente base generica β >1, si ha N = (d n d n−1......d1d 0 ) β = d n ⋅ β n + d n−1 ⋅ β n−1 + ...... + d1 ⋅ β 1 + d 0 ⋅ β 0 dove 0 ≤ d i ≤ β − 1 , con 0 ≤ i ≤ n . Note basi di rappresentazione sono la base binaria (β =2), ottale (β =8) ed esadecimale(β =16). Es. Sia il numero binario N=(100011111)2 Equivale a N = 1*28 + 0*27 + 0*26 + 0*25 + 1*24 + 1*23 + 1*22 + 1*21 + 1*20 2 = 256 +0 + 0 + 0 + 16 + 8 + 4 +2 +1 = (287)10 ⇒ (287)10=(100011111)2 β >1, vediamo come rappresentare in tale base un Ora fissata una base intera numero reale α. Teorema: Rappresentazione dei Numeri Reali Ogni numero reale α ≠0 può esprimersi univocamente, in base β, nella seguente forma: α = ± (a1β −1 + a2 β −2 + KK) ⋅ β p +∞ = sign (α ) ⋅ (∑ ai β −i ) ⋅ β p = sign (α ) ⋅ m ⋅ β p (1) i =1 dove • 1 se x > 0 sign( x ) = − 1 se x < 0 (funzione segno) • p ∈Z+, numero intero positivo • le cifre ai sono numeri interi che soddisfano le seguenti condizioni: I. 0 ≤ ai ≤ β − 1, i = 1,2,.... a1 ≠ 0 II. può esistere, eventualmente, un indice µ >1 tale che ∀ i ≥ µ sia ai = 0, ma non esiste alcun indice ν > 0 tale che ∀ i ≥ ν sia ai =β-1. Il numero m = a1β −1 + a2 β −2 + KK si chiama mantissa di α e soddisfa la condizione 1 β ≤ m < 1. 3 β p si definisce parte esponente di α e p si chiama esponente di α . Usando la notazione posizionale il numero α ≠0 si rappresenta α = ±0.a1a2 a3 K β p Rappresentazione Normalizzata Esempio: Il numero reale π può essere espresso in base β=10 nella forma π = + (3 ⋅ 10 −1 + 1 ⋅ 10 −2 + 4 ⋅ 10 −3 + 1 ⋅ 10 −4 + 5 ⋅ 10 −5 + 9 ⋅ 10 −6......)101 e in rappresentazione normalizzata diviene π = + (0.314159......)101 = 3.14159 2. I Numeri Finiti: Il Sistema Floating Point Un numero reale è caratterizzato da segno, esponente e mantissa, in cui la mantissa può essere costituita da un numero illimitato di cifre. Lavorando con il calcolatore, comunque, ognuna di queste parti deve essere limitata, ovvero rappresentata da un numero finito di bits. Da ciò nasce l’impossibilità di rappresentare nel calcolatore l’insieme dei numeri reali. Occorre, quindi, definire una rappresentazione approssimata dei numeri reali costituita da numeri la cui mantissa è rappresentata da un numero finito di cifre. Un numero finito si memorizza in un calcolatore in una parola costituita da l0 bits; in ogni bit si memorizza una cifra binaria 0 oppure 1. Consideriamo un calcolatore con β=2 e parola di lunghezza l0. Tre sono le quantità da memorizzare nella parola: il segno, l’esponente e la mantissa. 4 Se la parola del calcolatore è di l0=32 bits la suddivisione standard è del tipo: 1bit 23 bits Segno Mantissa 8 bits Esponente l0 varia nel calcolatore a seconda della precisione con cui si lavora: l0=32 in singola precisione (1 segno; 8 esponente, 23 mantissa) l0=64 in singola precisione (1 segno; 11 esponente, 52 mantissa). Fissato un intero t≥1, ad ogni numero reale α, espresso nella forma (1), si associa un numero finito float di α , fl(α), che si esprime nella forma 0 se α = 0 fl (α ) = p se α ≠ 0 ± mt β (2) dove m = a1β −1 + a2 β −2 + KK + at β Nella (2) si suppone che −t t = ∑ ai β − i con a1 ≠ 0. i =1 L ≤ p ≤ U. In notazione posizionale si può esprimere come fl (α ) = ±0.a1 a 2 ...a t β p . Def: Insieme Floating Point Si definisce Insieme dei Numeri di Macchina (Insieme Floating Point) con t cifre significative, base β, range (L,U) per rappresentare l’esponente, l’insieme dei numeri reali così definiti: 5 t −i p F ( β , t , L,U ) = {0} ∪ α ∈ ℜ : α = sign(α ) ∑ ai β β i =1 con t e β interi positivi e β>1, 0 ≤ ai ≤ β − 1, i = 1,2,.... a1 ≠ 0 , L≤p≤U. Teorema: Cardinalità dei numeri floating point Sia F ( β , t , L, U ) l’insieme dei numeri floating point. Allora esso possiede fl(0) e (β-1)·β t-1 (U-L+1) numeri positivi non uniformemente distribuiti in [βL-1,β U) e altrettanti numeri negativi non uniformemente distribuiti in (-β U,-βL-1], ovvero # F = 2 * ( β − 1) β t −1 (U − L + 1) + 1 Dim: Ragioniamo solo sui numeri positivi. La mantissa più piccola che si può scrivere in base β e con t cifre è 1 * β −1 + 0 * β −2 + ....0 * β − t = β −1 La mantissa più grande è ( β − 1) * β −1 + ( β − 1) * β −2 + ....( β − 1) * β − t = β 0 − β −1 + β −1 − β −2 + ... + β − t +1 − β − t = 1 − β − t Numero totale di mantisse (1 − β −t ) β t − β −1β t + 1 = β t − β 0 − β t −1 + 1 = β t −1 ( β − 1) 6 Es: base β = 10, t =5 cifre per la matissa, la mantissa più piccola è 0.10000= 10-1 la mantissa più grande è 0.99999=1-10-5 il numero totale di mantisse è (1 - 10-5 )105 - (10-1 )105 + 1 = 105 -1 -104 +1= 105 -104 = 104 (10-1)) Poiché per ogni mantissa si hanno (U-L+1) esponenti possibili ⇒ # elementi positivi in F= (β-1) β t-1 (U-L+1) #F=2*(β-1) β t-1 (U-L+1) +1. ■ Si osserva che i numeri dell’insieme F sono ugualmente spaziati tra le potenze successive di β ma non su tutto il range. Es: β=2, t=3, L=-1 e U=2 mpossibili=.100,…….,.111 Ogni mantissa è moltiplicata per βp ={2-1 20 21 22} ⇒ 4 mantisse possibili, 4 possibili esponenti Da cui 16 numeri positivi, 16 negativi e lo zero 7 Da cui segue che #F=33 Tali numeri sono: .100 2 -1 = (1 * 2 -1 ) 2 -1 = 1/2 ⋅ 1/2 = 4/16 .101 2 -1 = (1 * 2 -1 + 1 * 2 -3 ) 2 -1 = 5/16 -1 -1 -2 -1 .110 2 = (1 * 2 + 1 * 2 ) 2 = 6/16 -1 -1 -2 -3 -1 .111 2 = (1 * 2 + 1 * 2 + 1 * 2 ) 2 = 7/16 4 numeri relativi a 2-1 .100 2 0 = (1 * 2 -1 ) 1 = 1/2 = 8/16 .101 2 0 = (1 * 2 -1 + 1 * 2 -3 ) 1 = 10/16 0 4 numeri relativi a 2 0 -1 -2 .110 2 = (1 * 2 + 1 * 2 ) 1 = 12/16 0 -1 -2 -3 .111 2 = (1 * 2 + 1 * 2 + 1 * 2 ) 1 = 14/16 .100 21 = (1 * 2 -1 ) 2 = 1/2 ⋅ 2 = 16 /16 .101 21 = (1 * 2 -1 + 1 * 2 -3 ) 2 = 20 /16 1 4 numeri relativi a 2 1 -1 -2 .110 2 = (1 * 2 + 1 * 2 ) 2 = 24 /16 1 -1 -2 -3 .111 2 = (1 * 2 + 1 * 2 + 1 * 2 ) 2 = 28/16 .100 2 2 = (1 * 2 -1 ) 4 = 1/2 ⋅ 4 = 32 /16 .101 2 = (1 * 2 + 1 * 2 ) 4 = 40 /16 2 4 numeri relativi a 2 2 -1 -2 .110 2 = (1 * 2 + 1 * 2 ) 4 = 48/16 2 -1 -2 -3 .111 2 = (1 * 2 + 1 * 2 + 1 * 2 ) 4 = 56/16 2 -1 -3 Tali numeri sono equispaziati relativamente ad ogni singola base ma non globalmente. 4 16 5 16 6 16 2-1 7 16 8 16 12 16 10 16 20 14 16 16 16 20 16 24 16 21 28 16 32 16 56 16 48 16 40 16 22 8 Nella rappresentazione di un numero reale positivo α della forma (1) in un sistema di numeri di macchina F ( β , t , L, U ) , si possono presentare i seguenti casi: 1. Il numero α è tale che L≤p≤U e ai=0 per i>t ⇒ allora α è un numero di macchina ed è rappresentato esattamente. 2. p ∉ [L,U ]. Il numero non può essere rappresentato nel calcolatore. • Se p<L si verifca un underflow e solitamente si assume lo zero come valore approssimato, e ciò viene solitamente segnalato mediante warning. • Se p>U si verifica un overflow; non si approssima, ma si segnala l’evento con un arresto del calcolo. 3. p ∈ [L,U ] , ma le cifre ai, per i>t non sono tutte nulle. Nasce il problema di scegliere in F un rappresentante di α. Tale operazione può essere effettuata mediante troncamento o arrotondamento. Sia α ∈ ℜ + , α ≠0, tale che p ∈ [L,U ] e rappresentato in forma (1). Si denota con fl(α) il numero di macchina tale che • TRONCAMENTO · fl (α ) = Τronc(α ) = β t p ∑a β i =1 • ARROTONDAMENTO · fl (α ) = β Tronc ( p t +1 ∑a β i =1 i −i −i i 1 + β −t +1 ) 2 9 ES: α = 0.54321 Troncamento t=3 fl(α)=0.543 Arrotondamento fl(α)=Tronc(0.5432+0.0005)=Tronc(0.5437)=0.543 Nella sostituzione di α con fl(α) si ha l’origine degli errori di arrotondamento. Occorre stabilire una stima della differenza tra α e fl(α) pesata sul valore di α . Definizione: Si definisce Errore Relativo di arrotondamento di α la quantità α − fl (α ) α Teorema: Sia α un numero reale rappresentato in base β +∞ α = ± (∑ ai β − i ) ⋅ β p , a1 ≠ 0, i =1 p ∈ [L,U ] Allora, se non si verifica un Overflow, si ha: α − fl (α ) ≤ K ⋅ β 1−t = eps α Con K=1 K=1/2 (3) nel caso di troncamento nel caso di arrotondamento 10 Dimostrazione: a) caso troncamento α = ±.a1a2 ....β p fl (α ) = ±.a1a2 ...at β p α − fl (α ) = .at +1at +2 ...β −t β p α − fl (α ) .at +1at +2 ...β −t β p = con .at +1at +2 ... ≤ 1 e a1a2 ....... ≥ β −1 p .a1a2 .......β α ⇒ α − fl (α ) β −t ≤ −1 = β 1−t α β b) Caso di arrotondamento α − fl (α ) 1 −t p ≤ β β = β 1−t dalla definizione di arrotondamento 2 α 1 −t p β β 1 α − fl (α ) 2 ≤ −1 p = β 1−t 2 α β β ■ La quantità eps = K ⋅ β 1−t è detta precisione di macchina nel sistema floating point: eps è il più piccolo numero positivo di macchina tale che sommato all’unità rende una quantità più grande di 1: fl(1+eps)>1 11 E’ possibile determinare l’algoritmo per il calcolo di eps: eps=1 eps=0.5*eps eps1=1+eps no si eps1 > 1 eps=2*eps Un modo conveniente per esprimere la (3) è: ε ≤ eps fl(α)=α(1+ε) ES: Dstribuzione dei numeri Floating Point - Lo standard IEC559 Nel 1985 l’ IEEE ha sviluppato uno standard per l’insieme dei numeri finiti F, in modo da non avere nei diversi calcolatori numeri differenti. IEC559 prevede due formati per i numeri floating point: • un formato base, costituito dai sistemi F(2,24,-125,128) per la singola precisione F(2,53,-1021,1024) per la doppia precisione più l’insieme dei numeri denormalizzati. 12 • un formato esteso, per il quale vengono fissati i seguenti limiti: semplice doppia N ≥ 43 bits ≥ 79 L ≤ -1021 ≤ -16381 t ≥ 32 ≥ 64 U ≥ 1024 ≥ 16384 bits Quasi tutti i calcolatori soddisfano queste proprietà. Ad esempio in un Pentium si ha un sistema floating point F(2,24,-125,128) per la singola precisione e F(2,53,-1021,1024) per la doppia, completato, in entrambi i casi con i numeri denormalizzati. Si osserva che, nello standard, sono previste alcune codifiche particolari che corrispondono ai valori ±0, ±∞, NaN. valore esponente mantissa ±0 L-1 0 ±∞ U+1 0 NaN U+1 ≠0 13