SUBROUTINE D6RPLY(A, B1, C, SR, SI, LR, LI) C CALCULATE THE ZEROS OF THE QUADRATIC A*Z**2+B1*Z+C. C THE QUADRATIC FORMULA, MODIFIED TO AVOID C OVERFLOW, IS USED TO FIND THE LARGER ZERO IF THE C ZEROS ARE REAL AND BOTH ZEROS ARE COMPLEX. C THE SMALLER REAL ZERO IS FOUND DIRECTLY FROM THE C PRODUCT OF THE ZEROS C/A. DOUBLE PRECISION A, B1, C, SR, SI, LR, LI, B, 1 D, E, DSQRT IF (A.NE.0.D0) GO TO 20 SR = 0.D0 IF (B1.NE.0.D0) SR = -C/B1 LR = 0.D0 10 SI = 0.D0 LI = 0.D0 RETURN 20 IF (C.NE.0.D0) GO TO 30 SR = 0.D0 LR = -B1/A GO TO 10 C COMPUTE DISCRIMINANT AVOIDING OVERFLOW 30 B = B1/2.D0 IF (DABS(B).LT.DABS(C)) GO TO 40 E = 1.D0 - (A/B)*(C/B) D = DSQRT(DABS(E))*DABS(B) GO TO 50 40 E = A IF (C.LT.0.D0) E = -A E = B*(B/DABS(C)) - E D = DSQRT(DABS(E))*DSQRT(DABS(C)) 50 IF (E.LT.0.D0) GO TO 60 C REAL ZEROS IF (B.GE.0.D0) D = -D LR = (-B+D)/A SR = 0.D0 IF (LR.NE.0.D0) SR = (C/LR)/A GO TO 10 C COMPLEX CONJUGATE ZEROS 60 SR = -B/A LR = SR SI = DABS(D/A) LI = -SI RETURN END .