...

Esercizi sull`aritmetica floating point

by user

on
Category: Documents
16

views

Report

Comments

Transcript

Esercizi sull`aritmetica floating point
Esercizi sull’aritmetica floating point
Esercizio 1. Si consideri il seguente sistema point
F = {0.αβγ ∗ 10p ,
1 ≤ α ≤ 9, 0 ≤ β, γ, ≤ 9,
10 ≤ p ≤ 10}
con rounding.
1. Calcolare il numero positivo più grande e più piccolo di F.
Il numero positivo più grande si ottiene fissando tutte le cifre al valore
massimo (9) e l’esponente al valore massimo (10).
Quindi si ha M = 0.999 ∗ 1010 .
Il numero positivo più piccolo si ottiene fissando la prima cifra al valore
minimo (1), tenuto conto della rappresentazione normalizzata, e l’esponente
al valore minimo (-10).
Quindi si ha m = 0.100 ∗ 10−10 .
2. Calcolare l’epsilon di macchina.
Roundoff unit = 12 B 1−t = 12 10−2 = 0.005 essendo B = 10 e t = 3.
Ovvero lo spacing tra 1 e B = 10 è
0.100 ∗ 101
0.101 ∗ 101
−
numero successivo in F
0.001 ∗ 101
e l’epsilon di macchina corrisponde alla metà di tale spacing.
3. Calcolare le seguenti espressioni in F:
(a) 0.123 + 6. ∗ 10−4
(b) 0.1234 + 4. ∗ 10−4
Caso (a): entrambi i numeri vengono rappresentati esattamente in F.
0.123 ∗ 100
0.0006 ∗ 100
+
rappresentazione nella medesima potenza di B
0.1236 ∗ 100
operazione esatta
si considera poi il floating del risultato pari a 0.123 ∗ 100 .
Caso (b): del primo numero occorre considerare il floating corrispondente
pari a 0.123 ∗ 100 , mentre il secondo numero viene rappresentato esattamente in F.
0.123 ∗ 100
0.0004 ∗ 100
0.1234 ∗ 100
+
rappresentazione nella medesima potenza di B
operazione esatta
si considera poi il floating del risultato pari a 0.123 ∗ 100 .
1
4. Calcolare la seguente espressione in F e l’errore relativo commesso: 0.1235∗
103 − 0.1234 ∗ 103 . Di entrambi i numeri occore considerare il floating in
F, corrispondente rispettivamente a 0.124 ∗ 103 e 0.123 ∗ 103 , tenuto conto
che si effettua rounding.
0.124 ∗ 103
0.123 ∗ 103
−
0.001 ∗ 103
=1
operazione esatta
In aritmetica esatta si ha invece 0.1235 ∗ 103 − 0.1234 ∗ 103 = 0.1.
Pertanto l’errore relativo è
|0.1 − 1|/|0.1| = 9
e l’errore percentuale è pari al 900%.
Esercizio 2. Calcolare l’approssimazione di exp(x) mediante sviluppo in serie
di Taylor opportunamente troncato, confrontandolo con il valore fornito dalla
funzione di libreria exp mediante calcolo dell’errore relativo.
Più precisamente, per valori di x equispaziati in un intervallo di estremi assegnati in input, si implementi il seguente algoritmo di calcolo:
EXPn
= EXPn−1 +
EXP0
= 1
xn
,
n!
n≥1
fintanto che il valore di EXPn differisce dal valore di EXPn−1 .
È consigliabile calcolare il nuovo termine xn /n! facendo uso del termine precedentemente calcolato xn−1 /(n − 1)!.
%
a=input(’Estremo sinistro di campionamento=’);
b=input(’Estremo destro di campionamento=’);
ncampio=input(’Numero di campionamenti=’);
h=(b-a)/(ncampio-1); % passo di campionamento
%
% Pre-allocazione dei vettori
%
X=zeros(1,ncampio);
EXP_APP=zeros(size(X));
ERRORE=zeros(size(X));
Y_ESATTA=zeros(size(X));
%
X=a:h:b;
%
for i=1:ncampio,
OLD_EXP_S=0.e0;
2
NEW_EXP_S=1.e0;
FATTORIALE=1;
XX=X(i);
XX_potenza=1.e0;
N=0;
while OLD_EXP_S ~= NEW_EXP_S,
OLD_EXP_S=NEW_EXP_S;
N=N+1;
FATTORIALE=FATTORIALE*N; % calcolo N! come (N-1)!*N
XX_potenza=XX_potenza*XX; % calcolo XX^N come XX^(N-1)*XX
NEW_EXP_S=OLD_EXP_S+XX_potenza/FATTORIALE;
end
EXP_APP(i)=NEW_EXP_S;
% assegnamento della variabile scalare
% alla componente del vettore
NN(i)=N;
% assegnamento esponente potenza a cui si tronca
end
%
Y_ESATTA=exp(X);
ERRORE=abs(EXP_APP-Y_ESATTA)./Y_ESATTA; % errore relativo approssimazione
% - vettorizzazione
%
clear NEW_EXP_S OLD_EXP_S FATTORIALE XX XX_potenza N i h
Esercizio 3. Calcolare l’approssimazione della derivata prima di f (x) = sin(x)
in x = 1 mediante il rapporto incrementale (f (x + h) − f (x))/h per valori
decrescenti di h, confrontandolo con il valore fornito dalla funzione di libreria
per f 0 (x) mediante calcolo dell’errore relativo.
%
alpha=input(’Fattore di decrescita h=’);
x=1.e0;
derivata_esatta=cos(x);
h=1.e0;
nv=1500;
d0=sin(x);
derivata_approssimata=zeros(1,nv);
errore=zeros(size(derivata_approssimata));
for i=1:nv,
d1=sin(x+h);
derivata_approssimata(i)=(d1-d0)/h;
h=h*alpha;
end
errore=abs(derivata_approssimata-derivata_esatta);
%
clear h nv d0 d1 i
3
Fly UP