Есть программа отделяющая корни уравнений: 
  
 Код
uses crt; 
 var  
 a,b,x1,x2,y1,y2,h,w,y,e:real; 
 n,k:integer; 
   
   
 function f(x:real):real; 
 begin 
 f:=Sqr(x)-(0.1*exp(x))-5; 
 end; 
   
  begin 
 a:=-3; 
 b:=7; 
 h:=0.5; 
   clrscr; 
     k:=0; x1:=a; x2:=x1+h; y1:=f(x1); y2:=f(x2); 
   while x2<b do 
   
      begin y2:=f(x2); 
        if y1*y2<0 then 
                  begin inc (k); 
             writeln(k,'-й корень[',x1:4:1,';',x2:4:1,']') 
          end; 
      x1:=x2; x2:=x1+h; y1:=y2; 
    end; 
     repeat until keypressed 
  end.
  
 Есть еще кусок кода, уточняющий корни: 
 Код
 
 repeat 
  writeLn('Введите точность в пределах от 0 до 1 eps='); 
  readln(eps); 
  until (eps >0) and (eps <1); 
  clrscr; 
  {n := 0;} 
  repeat 
    c:=(f(b)*a-f(a)*b)/(f(b)-f(a)); 
    if f(a)*f(c) > 0 then a := c 
    else b := c; 
    {Inc(n)} 
  until abs((f(b)*a-f(a)*b)/(f(b)-f(a))-c)<eps; 
  x := c; 
  writeLn('Корень уравнения x=', x:10:7); 
  write('Для выхода нажмите Enter'); 
  {writeLn('Количество итераций =  ',n);} 
 
  
 Никак не могу слепить их воедино, чтобы программа сначала отделяла корни, а потом их уточняла. 
 По одиночке они работают, когда соединяю их прога зависает, видимо получается бесконечный цикл.