Comments
Description
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