PROGRAM rootsolve implicit none external myfunc double precision xmin,xmax,tol,x,zbrent,myfunc tol = 1.0e-6 xmin = 0.0 xmax = 0.5*3.14159 x = zbrent(myfunc,xmin,xmax,tol) WRITE(6,*) 'x = ',x STOP END DOUBLE PRECISION FUNCTION myfunc(x) implicit none double precision x myfunc = x - cos(x) RETURN END c This is the generic version on the web page with the following c changes: I have declared ZBRENT as double precision and I have c commented out the line "call dummy_call (eps) DOUBLE PRECISION FUNCTION ZBRENT(FUNC,X1,X2,TOL) IMPLICIT DOUBLE PRECISION (A-H,O-Z) PARAMETER (ITMAX=100,EPS=3.E-16) A=X1 B=X2 FA=FUNC(A) FB=FUNC(B) IF(FB*FA.GT.0.) PAUSE 'Root must be bracketed for ZBRENT.' FC=FB DO 11 ITER=1,ITMAX IF(FB*FC.GT.0.) THEN C=A FC=FA D=B-A E=D ENDIF IF(ABS(FC).LT.ABS(FB)) THEN A=B B=C C=A FA=FB FB=FC FC=FA ENDIF C call dummy_call( eps ) TOL1=2.*EPS*ABS(B)+0.5*TOL XM=.5*(C-B) IF(ABS(XM).LE.TOL1 .OR. FB.EQ.0.)THEN ZBRENT=B RETURN ENDIF IF(ABS(E).GE.TOL1 .AND. ABS(FA).GT.ABS(FB)) THEN S=FB/FA IF(A.EQ.C) THEN P=2.*XM*S Q=1.-S ELSE Q=FA/FC R=FB/FC P=S*(2.*XM*Q*(Q-R)-(B-A)*(R-1.)) Q=(Q-1.)*(R-1.)*(S-1.) ENDIF IF(P.GT.0.) Q=-Q P=ABS(P) IF(2.*P .LT. MIN(3.*XM*Q-ABS(TOL1*Q),ABS(E*Q))) THEN E=D D=P/Q ELSE D=XM E=D ENDIF ELSE D=XM E=D ENDIF A=B FA=FB IF(ABS(D) .GT. TOL1) THEN B=B+D ELSE B=B+SIGN(TOL1,XM) ENDIF FB=FUNC(B) 11 CONTINUE PAUSE 'ZBRENT exceeding maximum iterations.' ZBRENT=B RETURN END