1 RICHIAMI SUI NUMERI FLOATING-POINT Rappresentazione in virgola mobile di un numero reale x non nullo: x = (− 1) ⋅ (0.a1a 2 s a t ) ⋅ β e = (− 1) ⋅ m ⋅ β e −t s In cui: β ⇒ Base t ∈N ⇒ m = a1a 2 Numero di cifre significative a i consentito at L≤e≤U ⇒ s ⇒ ⇒ Numero intero detto “mantissa” tale t che 0 ≤ m ≤ β − 1 e a1 ≠ 0 Esponente (variabile fra i valori L < 0 e U> 0) Segno (s=0 oppure s=1) 2 Avendo a disposizione N posizioni di memoria, se ne usano: 1 ⇒ t ⇒ Il segno “s” Le cifre significative (coefficienti a i , i = 1, , t ) N − t −1 ⇒ L’esponente “e” Valgono le seguenti maggiorazioni per il modulo di x: x min = β L −1 ≤ x ≤ β U (1 − β − t ) = x max Esempio (β = 10, t = 4, L = −1, U = 2 ) : x min = (0.a1a 2 a 3a 4 )⋅ βL = (0.1000)⋅ 10 −1 = 10 −2 = βL −1 x max = (0.a1a 2 a 3a 4 )⋅ βU = (0.9999 )⋅ 10 2 = 10 2 − 10 −2 = βU (1 − β − t ) 3 Indichiamo con: t s e F(β, t, L, U) = { 0}∪ x ∈ R : x = (− 1) β ∑ aiβ −i î i=1 L’insieme dei “numeri macchina” (o numeri floatingpoint) con t cifre significative base β ≥ 2 , 0 ≤ a i ≤ β − 1 e range (L, U) con L ≤ e ≤ U . Esempio (β = 10, t = 4, L = −1, U = 2 ) : x = −53,87 = (− 1) ⋅ β e ⋅ (a1β −1 + a 2β −2 + a 3β −3 + a 4β −4 ) = s = (− 1) ⋅ 102 ⋅ (5 ⋅ 10 −1 + 3 ⋅ 10 −2 + 8 ⋅ 10 −3 + 7 ⋅ 10 −4 ) 1 In questo caso (e = U = 2, s = 1) 4 ARROTONDAMENTO DI UN NUMERO REALE NELLA RAPPRESENTAZIONE MACCHINA Sia dato x ∈ R . Si dimostra che vale: fl(x ) = x (1 + δ ) 1 1−t 1 δ ≤ β ≡ εM Con 2 2 εM è detto “epsilon macchina” e rappresenta la distanza fra il numero 1 e il successivo numero di floating-point, ovvero è il più piccolo numero per cui vale: 1 + εM > 1 Esempio (β = 10, t = 4 ) . Ponendo 1 δ = εM : 2 x = 12.3456789 1 fl(x ) = x (1 + δ) = 12.3456789 1 + 101− 4 = 12.3518517 2 Ricordando t=4: fl(x ) = 12.35 In MATLAB si vedano le istruzioni “realmin”, “realmax” e “eps”. 5 DISTRIBUZIONE DEI NUMERI FLOATING-POINT I numeri floating-point NON sono equispaziati ma si addensano in prossimità del più piccolo numero rappresentabile. Dato un numero floating-point x1 e il successivo più vicino x2 si ha: x1 = (− 1) ⋅ m ⋅ β e − t s x 2 = (− 1) ⋅ (m + 1)⋅ β e − t s La loro distanza (in modulo) è: x 2 − x1 = β e − t Quindi la distanza dipende dall’esponente “e”!!! Al crescere di un’unità di “e” la distanza cresce di un fattore β . Esempio (MATLAB): >> b = 2; L = −2; U = 2; >> f = qssfloat (b, L, U) 6 CANCELLAZIONE DI CIFRE SIGNIFICATIVE: Esempio: x = y x = 10 −15 utilizzando MATLAB x Si calcoli per e −1 >> x = 10^ (− 15) >> format long >> y1 = x / (exp(x ) − 1) y1 = 0.90071992547410 In realtà ci aspettiamo che: x =1 x →0 e x − 1 lim 7 Allora, espandendo l’esponenziale in serie di Taylor: y(x ) ≈ >> x x2 −1 1+ x + 2 = 1 1+ x 2 y 2 = 1 / (1 + x / 2 ) y2 = 0.999 996 14 CIFRE Da cui: y2 − y1 Errore percentuale = y2 ⋅ 100 ≈ 10 % !!! MOTIVAZIONE: Cancellazione nel calcolo di exp(x ) − 1 RIMEDIO: Sviluppo in serie di Taylor troncato a un ordine opportuno.