
function lezione2_esercizio_B

% SUCCESSIONE IN SINGOLA PRECISIONE.
I(1)=single(1/exp(1));
for ii=2:21
    I(ii)=single(1-ii*I(ii-1));
    if I(ii) < 0
        fprintf('\n \t WARNING SINGLE PREC.: NEGATIVE ENTRIES AT i=%3.0f',ii);
    end
end
fprintf('\n \n');

% SUCCESSIONE IN DOPPIA PRECISIONE.
II(1)=1/exp(1);
for ii=2:21
    II(ii)=1-ii*II(ii-1);
    if II(ii) < 0
        fprintf('\n \t WARNING DOUBLE PREC.: NEGATIVE ENTRIES AT i=%3.0f',ii);
    end
end

Is13=metodo_miller_single(13,1000,2);
Is20=metodo_miller_single(20,1000,2);
Is50=metodo_miller_single(50,1000,2);

Id13=metodo_miller_double(13,1000,2);
Id20=metodo_miller_double(20,1000,2);
Id50=metodo_miller_double(50,1000,2);

v=1:21; 
clf;
subplot(2,4,1); semilogy(v,I,'r-'); title('inst. single');
subplot(2,4,2); semilogy(v,II,'k-'); title('inst. double');
v=1:13; 
subplot(2,4,3); semilogy(v,Is13,'r-*'); title('st. single 13');
subplot(2,4,4); semilogy(v,Id13,'g-*'); title('st. double 13');
v=1:20; 
subplot(2,4,5); semilogy(v,Is20,'r-o');title('st. single 20');
subplot(2,4,6); semilogy(v,Id20,'g-o'); title('st. double 20');
v=1:50; 
subplot(2,4,7); semilogy(v,Is50,'r-s'); title('st. single 50');
subplot(2,4,8); semilogy(v,Id50,'g-s'); title('st. double 50');






% METODO DI MILLER (SINGLE PRECISION).

function I=metodo_miller_single(N,Ifin,n)

%Il codice pone I(N)=Ifin e calcola oltre a I(N) anche I(N-1), ..., I(n-1).
I=zeros(1,N); % Inizializzazione.
I(N)=single(Ifin);

for i=N:-1:n
    t1=single(1/i);
    t2=single(1-I(i));
    I(i-1)=t1*t2; 
end


% METODO DI MILLER (DOUBLE PRECISION).

function I=metodo_miller_double(N,Ifin,n)

%Il codice pone I(N)=Ifin e calcola oltre a I(N) anche I(N-1), ..., I(n-1).
I=zeros(1,N); % Inizializzazione.
I(N)=Ifin;

for i=N:-1:n
    t1=1/i;
    t2=1-I(i);
    I(i-1)=t1*t2; 
end
