Rappresentazione macchina dei numeri 2

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.