code 34436;
boolean procedure ZEROINRAT(X, Y, FX, TOLX);
real X, Y, FX, TOLX;
begin integer EXT; boolean FIRST;
real B, FB, A, FA, D, FD, C, FC, FDB, FDA, W,
MB, TOL, M, P, Q, DW;
DW:= DWARF; B:= X; FB:= FX; A:= X:= Y; FA:= FX; FIRST:= true;
INTERPOLATE: C:= A; FC:= FA; EXT:= 0;
EXTRAPOLATE: if ABS(FC) < ABS(FB) then
begin if C ^= A then begin D:= A; FD:= FA end;
A:= B; FA:= FB; B:= X:= C; FB:= FC; C:= A; FC:= FA
end INTERCHANGE;
TOL:= TOLX; M:= (C + B) * .5; MB:= M - B;
if ABS(MB) > TOL then
begin if EXT > 3 then W:= MB else
begin TOL:= TOL * SIGN(MB);
P:= (B - A) * FB; if FIRST then
begin Q:= FA - FB; FIRST:= false end else
begin FDB:= (FD - FB) / (D - B);
FDA:= (FD - FA) / (D - A);
P:= FDA * P; Q:= FDB * FA - FDA * FB
end; if P < 0 then
begin P:= -P; Q:= -Q end;
if EXT = 3 then P:= P * 2;
W:= if P < DW or P <= Q * TOL then TOL else
if P < MB * Q then P / Q else MB
end; D:= A; FD:= FA; A:= B; FA:= FB;
X:= B:= B + W; FB:= FX;
if (if FC >= 0 then FB >= 0 else FB <= 0) then
goto INTERPOLATE else
begin EXT:= if W = MB then 0 else EXT + 1;
goto EXTRAPOLATE
end
end; Y:= C;
ZEROINRAT:= if FC >= 0 then FB <= 0 else FB >= 0
end ZEROINRAT;
eop