home *** CD-ROM | disk | FTP | other *** search
-
- ! Bibliothek von Unterprogrammen für doppelt-genaue komplexe Rechnungen
- ! Die Beschreibung finden Sie in CMPLX_16.TXT . Zerrupfen Sie die Samm-
- ! lung nur mit Bedacht, da die Programme z.T. aufeinander zugreifen.
- ! (C) 1989 Thomas Groß, Lynarstraße 13, D 1 Berlin 65
-
-
- SUBROUTINE CDACOS(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDARCUS(A,B,C,D)
- C=ACOS(C)
- D=-D
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDACOSH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDACOS(A,B,D,C) ! Abramowitz 4.6.15
- C=-C
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDACOT(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDATAN(-A,-B,C,D) ! Abramowitz 4.4.5
- C=IVORZEI(A)*ASIN(1.D0)+C
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDACOTH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDACOT(-B,A,D,C) ! Abramowitz 4.6.19
- C=-C
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDASIN(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDARCUS(A,B,C,D)
- C=ASIN(C)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDASINH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDASIN(-B,A,D,C) ! Abramowitz 4.6.14
- D=-D
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDATAN(A,B,C,D)
-
- REAL*8 A,B,C,D
- IF(B) 2,1,2
- 1 C=ATAN(A)
- D=0.
- RETURN
- 2 D=1-A*A-B*B
- IF(D) 7,3,7
- 3 IF(A) 6,4,6
- 4 C=0.
- 5 D=IVORZEI(B)*1.D308
- RETURN
- 6 C=IVORZEI(A)*ASIN(1.D0)/2
- IF(ABS(A).GE.1.5D-154 .OR. ABS(B)-1.NE.0.) GOTO 8
- PRINT *
- PRINT *,' Aus dem Unterprogramm CDATAN: Underflow von LOG(A
- &^2) !'
- PAUSE'- Die Rückgabewerte sind Re = sgn(A) π/4 und Im = sgn(B)
- &1.D308'
- GOTO 5
- 7 C=ATAN2(2*A,D)/2 ! Abramowitz 4.4.39
- 8 D=LOG((A*A+(B+1)**2)/(A*A+(B-1)**2))/4
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDATANH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDATAN(-B,A,D,C) ! Abramowitz 4.6.16
- D=-D
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDCOS(A,B,C,D)
-
- REAL*8 A,B,C,D,CD0D0,CD7D2
- C=CD0D0(COS(A))*COSH(CD7D2(B))
- D=SIN(A)
- IF(ABS(A).GE.1.) D=CD0D0(D)
- D=-D*SINH(CD7D2(B))
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDCOSH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDCOS(-B,A,C,D) ! Abramowitz 4.5.8
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDCOT(A,B,C,D)
-
- REAL*8 A,B,C,D,V,W,X,Y,Z,CD0D0
- IF(B.NE.0.) GOTO 4
- D=0.
- Y=COS(A)
- Z=SIN(A)
- IF(ABS(A).GE.1.) Z=CD0D0(Z)
- IF(Z.NE.0.) GOTO 3
- IF(Y) 1,2,2
- 1 C=-1.D308
- RETURN
- 2 C=1.D308
- RETURN
- 3 C=CD0D0(Y)/Z
- RETURN
- 4 V=B
- IF(ABS(V).GT.355.) V=IVORZEI(V)*3.55D2 ! kein Overflow in CDDIV
- CALL CDCOS(A,V,W,X)
- CALL CDSIN(A,V,Y,Z)
- CALL CDDIV(W,X,Y,Z,C,D)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDCOTH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDCOT(-B,A,D,C) ! Abramowitz 4.5.12
- C=-C
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDDIV(A1,B1,A2,B2,C,D)
-
- REAL*8 A1,A2,B1,B2,C,D
- D=A2*A2+B2*B2
- IF(A2.NE.0. .OR. B2.NE.0.) GOTO 2
- PRINT *
- PRINT *,' Aus dem Unterprogramm CDDIV: Der Nenner ist 0 .'
- 1 PAUSE'- Die Rückgabewerte sind Re = 0. und Im = 0.'
- C=0.
- RETURN
- 2 IF(D) 4,3,4
- 3 PRINT *
- PRINT *,' Aus dem Unterprogramm CDDIV: Underflow des Nenner
- &betrags!'
- GOTO 1
- 4 C=(A1*A2+B1*B2)/D
- D=(A2*B1-A1*B2)/D
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDEXP(A,B,C,D)
-
- REAL*8 A,B,C,D,CD0D0,CD7D2
- C=EXP(CD7D2(A))
- D=SIN(B)
- IF(ABS(B).GE.1.) D=CD0D0(D)
- D=C*D
- C=C*CD0D0(COS(B))
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDLOG(A,B,C,D)
-
- REAL*8 A,B,C,D
- IF(A.NE.0.) GOTO 5
- IF(B) 1,3,2
- 1 C=LOG(-B)
- D=-ASIN(1.D0)
- RETURN
- 2 C=LOG(B)
- D=ASIN(1.D0)
- RETURN
- 3 PRINT *
- PRINT *,' Aus dem Unterprogramm CDLOG: ln 0 ist nicht def
- &iniert!'
- 4 PAUSE'- Die Rückgabewerte sind Re = - 1.D308 und Im = 0.'
- C=-1.D308
- D=0.
- RETURN
- 5 C=SQRT(A*A+B*B)
- IF(C) 7,6,7
- 6 PRINT *
- PRINT *,' Aus dem Unterprogramm CDLOG: Underflow von SQRT(A
- &^2 + B^2) !'
- GOTO 4
- 7 C=LOG(C) ! Abramowitz 4.1.2
- D=ATAN2(B,A)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDMUL(A1,B1,A2,B2,C,D)
-
- REAL*8 A1,A2,B1,B2,C,D
- C=A1*A2-B1*B2
- D=A1*B2+A2*B1
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDPOT(A1,B1,A2,B2,C,D)
-
- REAL*8 A1,A2,B1,B2,C,D
- IF(A1.NE.0..OR.B1.NE.0.) GOTO 2
- IF(A2.NE.0..OR.B2.NE.0.) GOTO 1
- PRINT *
- PRINT *,' Aus dem Unterprogramm CDPOT: 0^0 ist nicht defi
- &niert!'
- PAUSE'- Die Rückgabewerte sind Re = 0. und Im = 0.'
- 1 C=0.
- D=0.
- RETURN
- 2 CALL CDLOG(A1,B1,C,D) ! Abramowitz 4.2.7
- CALL CDEXP(A2*C-B2*D,A2*D+B2*C,C,D)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDSIN(A,B,C,D)
-
- REAL*8 A,B,C,D,CD0D0,CD7D2
- C=SIN(A)
- IF(ABS(A).GE.1.) C=CD0D0(C)
- C=C*COSH(CD7D2(B))
- D=CD0D0(COS(A))*SINH(CD7D2(B))
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDSINH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDSIN(-B,A,D,C) ! Abramowitz 4.5.7
- D=-D
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDSQRT(A,B,C,D)
-
- REAL*8 A,B,C,D,Z,CD0D0
- IF(A.NE.0.) GOTO 3
- C=SQRT(ABS(B)/2)
- IF(B) 1,2,2
- 1 D=-C
- RETURN
- 2 D=C
- RETURN
- 3 D=SQRT(SQRT(A*A+B*B)) ! Abramowitz 3.7.26
- IF(D) 5,4,5
- 4 PRINT *
- PRINT *,' Aus dem Unterprogramm CDSQRT: Underflow von SQRT(
- &A^2 + B^2) !'
- PAUSE'- Die Rückgabewerte sind Re = 0. und Im = 0.'
- 5 Z=ATAN2(B,A)/2
- C=D*CD0D0(COS(Z))
- D=D*SIN(Z)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDTAN(A,B,C,D)
-
- REAL*8 A,B,C,D,V,W,X,Y,Z,CD0D0
- IF(B.NE.0.) GOTO 1
- C=TAN(A)
- IF(ABS(A).GE.1.) C=CD0D0(C)
- IF(ABS(C).GT.1.E16) C=IVORZEI(C)*1.D308 ! Vergrößert auf ± ∞
- D=0.
- RETURN
- 1 V=B
- IF(ABS(V).GT.355.) V=IVORZEI(V)*3.55D2 ! kein Overflow in CDDIV
- CALL CDSIN(A,V,W,X)
- CALL CDCOS(A,V,Y,Z)
- CALL CDDIV(W,X,Y,Z,C,D)
- END
-
- !---------------------------------------------------------------------!
-
- SUBROUTINE CDTANH(A,B,C,D)
-
- REAL*8 A,B,C,D
- CALL CDTAN(-B,A,D,C) ! Abramowitz 4.5.9
- D=-D
- END
-
- !=====================================================================!
-
- ! Hilfsprogramme
-
-
- REAL*8 FUNCTION CD0D0(X)
- ! Verkleinert < ± 2.D-16 auf 0.
- ! wegen Rundungsfehlern von cos(π/2) , sin(π) , tan(π)
- REAL*8 X
- CD0D0=X
- IF(ABS(X).LT.2.E-16) CD0D0=0.
- END
-
-
- REAL*8 FUNCTION CD7D2(X)
- ! Verkleinert > ± 704 auf ± 704 wegen Overflow
- ! von exp( ) , cosh( ) , sinh( )
- REAL*8 X
- CD7D2=X
- IF(ABS(X).GT.704.) CD7D2=IVORZEI(X)*7.04D2
- END
-
-
- SUBROUTINE CDARCUS(A,B,Z,D)
- REAL*8 A,B,C,D,Y,Z,CDKETTE
- C=SQRT((1+A)**2+B*B) ! Abramowitz 4.4.37,38
- D=SQRT((1-A)**2+B*B)
- Y=(C+D)/2
- Z=A
- IF(B) 2,1,2
- 1 IF(ABS(A).LT.1.D0) GOTO 6
- Y=ABS(A)
- Z=IVORZEI(A)
- GOTO 6
- 2 IF(A) 4,3,4
- 3 D=IVORZEI(B)*LOG(Y+ABS(B))
- RETURN
- 4 Z=(C-D)/2 ! numerisch sehr gefährliche Differenz der Wurzeln
- V=ABS(B/A)
- IF(ABS(A).LE.2. .OR. V.GT.0.3 .AND. V.LT.3.) GOTO 5
- IF(V.LE.0.3) THEN
- C=1/(A+1) ! Reihenentwicklung für 0,3|A| > |B|
- D=1/(A-1)
- Z=B*B/4
- Z=IVORZEI(A)*(1-ABS(Z*(C*CDKETTE(C*Z*C)-D*CDKETTE(D*Z*D))))
- ELSE
- C=(A+1)**2 ! Reihenentwicklung für 3|A| < |B|
- D=(A-1)**2
- Z=4*B*B
- Z=(C*CDKETTE(C/Z)-D*CDKETTE(D/Z))/4/ABS(B)
- ENDIF
- 5 IF(ABS(Z).GT.1.D0) Z=IVORZEI(A) ! gegen Rundungsfehler
- 6 D=IVORZEI(B)*LOG(Y+SQRT(Y*Y-1))
- END
-
-
- REAL*8 FUNCTION CDKETTE(X)
- ! Reihenentwicklung der Wurzel in CDARCUS , Abramowitz 3.6.11
- REAL*8 X
- CDKETTE=1+X*(-1+X*(2+X*(-5+X*(14+X*(-42+X*(132+X*(-429+
- & X*(1430+X*(-4862+X*(16796-X*48155))))))))))
- END ! eigene Restgliedkorrektur ^
-
-
- FUNCTION IVORZEI(X)
- ! spezielle Vorzeichenfunktion
- REAL*8 X
- IF(X) 1,2,2
- 1 IVORZEI=-1
- RETURN
- 2 IVORZEI=1
- END
-
- ! * * *
-