function [c,k,semilunghezza,residuopesato]=bisezione(a,b,tolintv,tolres,maxit,f)
    
if b < a
    s=b; b=a; a=s;
end
fa=feval(f,a); fb=feval(f,b);

if fa*fb > 0
   fprintf('\n \t f(a)*f(b) > 0. Ipotesi di bisezione non verificata.');
    c=NaN; k=0; semilunghezza=NaN; residuopesato=NaN; 
    return;
end

if fa == 0
    c=a; k=0; semilunghezza=(b-a)/2; residuopesato=0; 
    return;
end
if fb == 0
    c=b; k=0; semilunghezza=(b-a)/2; residuopesato=0; 
    return;
end

for index=1:maxit
    c(index)=(a+b)/2; fc=feval(f,c(index));
    if sign(fc) == sign(fa)
        a=c(index); fa=fc;  
            else
        b=c(index); fb=fc;  
    end
    semilunghezza(index)=(b-a)/2; den=(fb-fa);
    if den == 0
       den=eps; 
    end
    w=(b-a)/den; residuopesato(index)=abs(fc*w);
   if (residuopesato(index) < tolres) | ...
      (semilunghezza(index) < tolintv)
        k=index; fprintf('\n'); return;
    end
   fprintf('\n \t [IT]:%3.0f [c]: %5.5f [a]:%3.3f',...
              index,c(index),a)
   fprintf('[AMP]: %2.2e [WRES]:%2.2e',...
              semilunghezza(index),residuopesato(index));
end
k=maxit; fprintf('\n')