code 34453;
boolean procedure ZEROINDER(X, Y, FX, DFX, TOLX);
real X, Y, FX, DFX, TOLX;
begin integer EXT;
real B, FB, DFB, A, FA, DFA, C, FC, DFC, D, W, MB,
TOL, M, P, Q, DW;
DW:= DWARF;
B:= X; FB:= FX; DFB:= DFX; A:= X:= Y; FA:= FX; DFA:= DFX;
INTERPOLATE: C:= A; FC:= FA; DFC:= DFA; EXT:= 0;
EXTRAPOLATE: if ABS(FC) < ABS(FB) then
begin A:= B; FA:= FB; DFA:= DFB; B:= X:= C; FB:= FC;
DFB:= DFC; C:= A; FC:= FA; DFC:= DFA
end INTERCHANGE;
TOL:= TOLX; M:= (C + B) * 0.5; MB:= M - B;
if ABS(MB) > TOL then
begin if EXT > 2 then W:= MB else
begin TOL:= TOL * SIGN(MB);
D:= if EXT = 2 then DFA else (FB - FA) / (B - A);
P:= FB * D * (B - A);
Q:= FA * DFB - FB * D;
if P < 0 then begin P:= -P; Q:= -Q end;
W:= if P < DW or P <= Q * TOL then TOL else
if P < MB * Q then P / Q else MB;
end; A:= B; FA:= FB; DFA:= DFB;
X:= B:= B + W; FB:= FX; DFB:= DFX;
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;
ZEROINDER:= if FC >= 0 then FB <= 0 else FB >= 0
end ZEROINDER;
eop