Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- FUNCTION SQRT_ITER(GUESS,X)
- DOUBLE PRECISION SQRT_ITER,GUESS,X,IMPROVE
- LOGICAL GOOD_ENOUGH
- EXTERNAL GOOD_ENOUGH,IMPROVE
- 10 GUESS=IMPROVE(GUESS,X)
- IF (.NOT.GOOD_ENOUGH(GUESS,X)) GOTO 10
- SQRT_ITER=GUESS
- END
- FUNCTION IMPROVE(GUESS,X)
- DOUBLE PRECISION IMPROVE,GUESS,X,AVERAGE
- EXTERNAL AVERAGE
- IMPROVE=AVERAGE(GUESS,X/GUESS)
- END
- FUNCTION AVERAGE(X,Y)
- DOUBLE PRECISION AVERAGE,X,Y
- AVERAGE=(X+Y)/2.0D0
- END
- FUNCTION GOOD_ENOUGH(GUESS,X)
- LOGICAL GOOD_ENOUGH
- DOUBLE PRECISION GUESS,X,TOL
- PARAMETER (TOL=0.001D0)
- GOOD_ENOUGH=DABS(GUESS*GUESS-X).LT.TOL
- END
- FUNCTION MYSQRT(X)
- DOUBLE PRECISION MYSQRT,X,GUESS,SQRT_ITER
- EXTERNAL SQRT_ITER
- DOUBLE PRECISION ZERO,ONE
- PARAMETER(ZERO=0.0D0,ONE=1.0D0)
- C
- C XXX COMPUTING THE SQRT OF ZERO RESULTS IN DIVIDE BY ZERO
- C
- MYSQRT=ZERO
- IF (X.EQ.ZERO) RETURN
- IF (X.LT.ZERO) X=-X
- GUESS=ONE
- MYSQRT=SQRT_ITER(GUESS,X)
- END
- IMPLICIT NONE
- DOUBLE PRECISION REZ,X,XMIN,XMAX,STEP
- DATA REZ/0.0D0/,STEP/.001D0/,XMIN/0.0D0,XMAX/10000.0D0/
- DOUBLE PRECISION MYSQRT
- EXTERNAL MYSQRT
- DO 10 X=XMIN,XMAX,STEP
- REZ=REZ+MYSQRT(X)*STEP
- 10 CONTINUE
- PRINT*,REZ
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement