code 34433;
   real procedure MININ(X, A, B, FX, TOLX);
   real X, A, B, FX, TOLX;
   begin comment SEE BRENT, 1973, P79;
       real Z, C, D, E, M, P, Q, R, TOL, T, U, V, W, FU, FV, FW, FZ;
       C:= (3 - SQRT(5)) / 2; if A > B then 
       begin Z:= A; A:= B; B:= Z end;
       W:= X:= A; FW:= FX; Z:= X:= B; FZ:= FX; if FZ > FW then 
       begin Z:= W; W:= X; V:= FZ; FZ:= FW; FW:= V end;
       V:= W; FV:= FW; E:= 0;
   LOOP: M:= (A + B) * 0.5; TOL:= TOLX; T:= TOL * 2;
       if ABS(Z - M) > T - (B - A) * 0.5 then 
       begin P:= Q:= R:= 0; if ABS(E) > TOL then 
           begin R:= (Z - W) * (FZ - FV);
               Q:= (Z - V) * (FZ - FW); P:= (Z - V) * Q - (Z - W) * R;
               Q:= (Q - R) * 2; if Q>0 then P:= -P else Q:= -Q;
               R:= E; E:= D
           end;
           if ABS(P) < ABS(Q * R * 0.5) and P > (A - Z) * Q
           and P < (B - Z) * Q then 
           begin D:= P / Q; U:= Z + D;
               if U - A < T or B - U < T then 
               D:= if Z < M then TOL else -TOL
           end else 
           begin E:= (if Z < M then B else A) - Z; D:= C * E
           end;
           U:= X:= Z + (if ABS(D) >= TOL then D else if D > 0
           then TOL else -TOL); FU:= FX;
           if FU <= FZ then 
           begin if U < Z then B:= Z else A:= Z;
               V:= W; FV:= FW; W:= Z; FW:= FZ; Z:= U; FZ:= FU
           end else 
           begin if U < Z then A:= U else B:= U;
               if FU <= FW then 
               begin V:= W; FV:= FW; W:= U; FW:= FU end else 
               if FU <= FV or V = W then 
               begin V:= U; FV:= FU end 
           end; goto LOOP
       end; X:= Z; MININ:= FZ
   end MININ;
        eop