program Wurzel;

var
   radikand	    : real;
   obere_grenze	    : real;
   untere_grenze    : real;
   zwischenergebnis : real;
   nachkommastellen : integer;


function mittelwert(a,b : real) : real;
begin
   mittelwert:=(a+b)/2;
end; { mittelwert }

function neue_obergrenze(alt,neu,w :  real) : real;
begin
   if (sqr(neu)>=w) then
      neue_obergrenze:=neu
   else
      neue_obergrenze:=alt
end; { neue_obergrenze }

function neue_untergrenze(alt,neu,w :  real) : real;
begin
   if (sqr(neu)<=w) then
      neue_untergrenze:=neu
   else
      neue_untergrenze:=alt
end; { neue_untergrenze }


   

begin 

   writeln('Eingabe eines Radikanden');
   readln(radikand);
   writeln('Wieviele Nachkommastellen?');
   readln(nachkommastellen);


   { Die Anfangswerte für die Grenzen werden gesetzt}
   untere_grenze := 0;
   obere_grenze := 1;

   { Die ersten Grenzen werden gesucht}
   
   while (not((sqr(untere_grenze)<=radikand) and (sqr(obere_grenze)>=radikand))) do
   begin
      untere_grenze := untere_grenze+1;
      obere_grenze := obere_grenze+1;
   end;

   { Wenn der Radikand bereits untere oder obere Grenze ist, kann abgebrochen werden}
   if (sqr(untere_grenze)=radikand) then
      writeln('Die Wurzel von ist: ',radikand:0:nachkommastellen+2, ' ist ', untere_grenze:0:nachkommastellen);

   if (sqr(obere_grenze)=radikand) then
      writeln('Die Wurzel von ist: ',radikand:0:nachkommastellen+2, ' ist ', obere_grenze:0:nachkommastellen);

   { Das Intervallschachtelungsverfahren wird durchgeführt}
   
   if ((sqr(untere_grenze)<>radikand) and (sqr(obere_grenze)<> radikand)) then
   begin
      repeat
	 writeln(untere_grenze:30:nachkommastellen+2, ' <= wurzel(',radikand:0:nachkommastellen+2, ') <= ',obere_grenze:10:nachkommastellen+2);
	 zwischenergebnis:=mittelwert(untere_grenze,obere_grenze);
	 obere_grenze:=neue_obergrenze(obere_grenze,zwischenergebnis,radikand);
	 untere_grenze:=neue_untergrenze(untere_grenze,zwischenergebnis,radikand);
      until (obere_grenze-untere_grenze<1/exp(nachkommastellen*ln(10)));
      writeln(untere_grenze:30:nachkommastellen+2, ' <= wurzel(',radikand:0:nachkommastellen+2, ') <= ',obere_grenze:10:nachkommastellen+2);
   end;
	

end.











