ack/lang/a68s/liba68s/complex.p
1988-10-04 13:41:01 +00:00

295 lines
9.3 KiB
OpenEdge ABL

22300 #include "rundecs.h"
22310 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *)
22320 (**)
22330 PROCEDURE ERRORR(N: INTEGER);EXTERN;
22340 PROCEDURE GARBAGE(ANOBJECT: OBJECTP);EXTERN;
22350 FUNCTION SAFEACCESS(LOCATION: OBJECTP): UNDRESSP; EXTERN;
22360 (**)
22370 (**)
22380 FUNCTION CRCOMPLEX(REPART,IMAGPART: REAL): OBJECTP;
22390 VAR NEWCOMPLEX: OBJECTP;
22400 BEGIN
22410 ENEW(NEWCOMPLEX, STRUCTCONST+2*SZREAL);
22420 WITH NEWCOMPLEX^ DO
22430 BEGIN
22440 (*-02() FIRSTWORD := SORTSHIFT * ORD(STRUCT); ()-02*)
22450 (*+02() PCOUNT:=0; SORT:=STRUCT; ()+02*)
22460 LENGTH := STRUCTCONST+2*SZREAL;
22470 DBLOCK := COMPLEX;
22480 RE := REPART;
22490 IM := IMAGPART
22500 END;
22510 CRCOMPLEX := NEWCOMPLEX
22520 END;
22530 (**)
22540 (**)
22550 FUNCTION WIDREAL(REA: REAL): OBJECTP;
22560 (*PWIDEN+2*)
22570 BEGIN
22580 WIDREAL := CRCOMPLEX(REA,0.0)
22590 END;
22600 (**)
22610 (**)
22620 FUNCTION CPLUS(LEFT,RIGHT: OBJECTP): OBJECTP;
22630 VAR NEWOBJ: OBJECTP;
22640 BEGIN
22650 IF FPTST(LEFT^) THEN NEWOBJ := LEFT
22660 ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
22670 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
22680 WITH NEWOBJ^ DO
22690 BEGIN
22700 RE := LEFT^.RE+RIGHT^.RE;
22710 IM := LEFT^.IM+RIGHT^.IM
22720 END;
22730 IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
22740 CPLUS := NEWOBJ
22750 END;
22760 (**)
22770 (**)
22780 FUNCTION CMINUS(LEFT,RIGHT: OBJECTP): OBJECTP;
22790 VAR NEWOBJ: OBJECTP;
22800 BEGIN
22810 IF FPTST(LEFT^) THEN NEWOBJ := LEFT
22820 ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
22830 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
22840 WITH NEWOBJ^ DO
22850 BEGIN
22860 RE := LEFT^.RE-RIGHT^.RE;
22870 IM := LEFT^.IM-RIGHT^.IM
22880 END;
22890 IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
22900 CMINUS := NEWOBJ
22910 END;
22920 (**)
22930 (**)
22940 FUNCTION CTIMS(LEFT,RIGHT: OBJECTP): OBJECTP;
22950 VAR NEWOBJ: OBJECTP;
22960 TEMPREAL: REAL;
22970 BEGIN
22980 IF FPTST(LEFT^) THEN NEWOBJ := LEFT
22990 ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
23000 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
23010 TEMPREAL := LEFT^.RE*RIGHT^.RE-LEFT^.IM*RIGHT^.IM;
23020 WITH NEWOBJ^ DO
23030 BEGIN
23040 IM := LEFT^.RE*RIGHT^.IM+LEFT^.IM*RIGHT^.RE;
23050 RE := TEMPREAL
23060 END;
23070 IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
23080 CTIMS := NEWOBJ
23090 END;
23100 (**)
23110 (**)
23120 FUNCTION CDIV(LEFT,RIGHT: OBJECTP): OBJECTP;
23130 VAR NEWOBJ: OBJECTP;
23140 TEMPREAL,RIGHTSQR: REAL;
23150 BEGIN
23160 IF FPTST(LEFT^) THEN NEWOBJ := LEFT
23170 ELSE IF FPTST(RIGHT^) THEN NEWOBJ := RIGHT
23180 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
23190 RIGHTSQR := SQR(RIGHT^.RE)+SQR(RIGHT^.IM);
23200 TEMPREAL := (LEFT^.RE*RIGHT^.RE+LEFT^.IM*RIGHT^.IM)/RIGHTSQR;
23210 WITH NEWOBJ^ DO
23220 BEGIN
23230 IM := (LEFT^.IM*RIGHT^.RE-LEFT^.RE*RIGHT^.IM)/RIGHTSQR;
23240 RE := TEMPREAL
23250 END;
23260 IF (FPTST(LEFT^)) AND (FPTST(RIGHT^)) THEN GARBAGE(RIGHT);
23270 CDIV := NEWOBJ
23280 END;
23290 (**)
23300 (**)
23310 FUNCTION CNEGI(CNUMB: OBJECTP): OBJECTP;
23320 VAR NEWOBJ: OBJECTP;
23330 BEGIN
23340 IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
23350 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
23360 WITH NEWOBJ^ DO
23370 BEGIN
23380 RE := -CNUMB^.RE;
23390 IM := -CNUMB^.IM
23400 END;
23410 CNEGI := NEWOBJ
23420 END;
23430 (**)
23440 (**)
23450 FUNCTION CCONJ(CNUMB: OBJECTP): OBJECTP;
23460 VAR NEWOBJ: OBJECTP;
23470 BEGIN
23480 IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
23490 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
23500 WITH NEWOBJ^ DO
23510 BEGIN
23520 RE := CNUMB^.RE;
23530 IM := -CNUMB^.IM
23540 END;
23550 CCONJ := NEWOBJ
23560 END;
23570 (**)
23580 (**)
23590 FUNCTION CRE(CNUMB: OBJECTP): REAL;
23600 BEGIN
23610 CRE := CNUMB^.RE;
23620 IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
23630 END;
23640 (**)
23650 (**)
23660 FUNCTION CIM(CNUMB: OBJECTP): REAL;
23670 BEGIN
23680 CIM := CNUMB^.IM;
23690 IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
23700 END;
23710 (**)
23720 (**)
23730 FUNCTION CABSI(CNUMB: OBJECTP): REAL;
23740 BEGIN
23750 WITH CNUMB^ DO
23760 CABSI := SQRT(SQR(RE)+SQR(IM));
23770 IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
23780 END;
23790 (**)
23800 (**)
23810 FUNCTION ARG(CNUMB: OBJECTP): REAL;
23820 VAR RESULT: REAL;
23830 BEGIN
23840 WITH CNUMB^ DO
23850 IF (RE<>0.0) OR (IM<>0.0) THEN
23860 IF ABS(RE)>ABS(IM) THEN
23870 RESULT := ARCTAN(IM/RE)+HALFPI.ACTUALPI*(1-ORD(RE>0.0))*2*(1-2*ORD(IM<0.0))
23880 ELSE RESULT := -ARCTAN(RE/IM)+HALFPI.ACTUALPI*(ORD(IM>0.0)-ORD(IM<0.0))
23890 ELSE ERRORR(RARG);
23900 ARG := RESULT
23910 END;
23920 (**)
23930 (**)
23940 FUNCTION CARG(CNUMB: OBJECTP): REAL;
23950 BEGIN
23960 CARG := ARG(CNUMB);
23970 IF FPTST(CNUMB^) THEN GARBAGE(CNUMB)
23980 END;
23990 (**)
24000 (**)
24010 FUNCTION CPOW(CNUMB: OBJECTP;POW: INTEGER): OBJECTP;
24020 VAR NEWOBJ: OBJECTP;
24030 CMOD,CMODPOW,NTHETA: REAL;
24040 NEGPOW: BOOLEAN;
24050 BEGIN
24060 IF FPTST(CNUMB^) THEN NEWOBJ := CNUMB
24070 ELSE NEWOBJ := CRCOMPLEX(0.0,0.0);
24080 WITH CNUMB^ DO
24090 CMOD := SQRT(SQR(RE)+SQR(IM));
24100 IF CMOD<>0.0 THEN
24110 BEGIN
24120 NEGPOW := POW<0;
24130 POW := ABS(POW);
24140 NTHETA := POW*ARG(CNUMB);
24150 CMODPOW := 1;
24160 WHILE POW<>0 DO
24170 BEGIN
24180 IF POW MOD 2=1 THEN CMODPOW := CMODPOW*CMOD;
24190 CMOD := SQR(CMOD);
24200 POW := POW DIV 2
24210 END;
24220 WITH NEWOBJ^ DO
24230 BEGIN
24240 RE := COS(NTHETA)*CMODPOW;
24250 IM := SIN(NTHETA)*CMODPOW;
24260 IF NEGPOW THEN
24270 BEGIN
24280 CMOD := SQR(RE)+SQR(IM);
24290 RE := RE/CMOD;
24300 IM := -IM/CMOD
24310 END
24320 END
24330 END
24340 ELSE WITH NEWOBJ^ DO
24350 BEGIN
24360 RE := 0.0;
24370 IM := 0.0
24380 END;
24390 CPOW := NEWOBJ;
24400 END;
24410 (**)
24420 (**)
24430 FUNCTION CEQ(LEFT,RIGHT: OBJECTP): INTEGER;
24440 VAR EQUALS: BOOLEAN;
24450 BEGIN
24460 EQUALS := (LEFT^.RE=RIGHT^.RE) AND (LEFT^.IM=RIGHT^.IM);
24470 IF FPTST(LEFT^) THEN GARBAGE(LEFT);
24480 IF FPTST(RIGHT^) THEN GARBAGE(RIGHT);
24490 IF EQUALS THEN CEQ := TRUEVAL ELSE CEQ := 0
24500 END;
24510 (**)
24520 (**)
24530 FUNCTION CNE(LEFT,RIGHT: OBJECTP): INTEGER;
24540 VAR NOTEQUAL: BOOLEAN;
24550 BEGIN
24560 NOTEQUAL := (LEFT^.RE<>RIGHT^.RE) OR (LEFT^.IM<>RIGHT^.IM);
24570 IF FPTST(LEFT^) THEN GARBAGE(LEFT);
24580 IF FPTST(RIGHT^) THEN GARBAGE(RIGHT);
24590 IF NOTEQUAL THEN CNE := TRUEVAL ELSE CNE := 0
24600 END;
24610 (**)
24620 (**)
24630 FUNCTION CPLUSAB(DESTINATION,INCREMENT: OBJECTP): OBJECTP;
24640 VAR REALPTR: UNDRESSP;
24650 BEGIN
24660 REALPTR := SAFEACCESS(DESTINATION);
24670 REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL+INCREMENT^.RE;
24680 REALPTR := INCPTR(REALPTR,SZREAL);
24690 REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL+INCREMENT^.IM;
24700 IF FPTST(INCREMENT^) THEN GARBAGE(INCREMENT);
24710 CPLUSAB := DESTINATION
24720 END;
24730 (**)
24740 (**)
24750 FUNCTION CMINAB(DESTINATION,DECREMENT: OBJECTP): OBJECTP;
24760 VAR REALPTR: UNDRESSP;
24770 BEGIN
24780 REALPTR := SAFEACCESS(DESTINATION);
24790 REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL-DECREMENT^.RE;
24800 REALPTR := INCPTR(REALPTR,SZREAL);
24810 REALPTR^.FIRSTREAL := REALPTR^.FIRSTREAL-DECREMENT^.IM;
24820 IF FPTST(DECREMENT^) THEN GARBAGE(DECREMENT);
24830 CMINAB := DESTINATION
24840 END;
24850 (**)
24860 (**)
24870 FUNCTION CTIMSAB(DESTINATION,FACTOR: OBJECTP): OBJECTP;
24880 VAR REALPTR,IMAGPTR: UNDRESSP;
24890 TEMPREAL: REAL;
24900 BEGIN
24910 REALPTR := SAFEACCESS(DESTINATION);
24920 IMAGPTR := INCPTR(REALPTR,SZREAL);
24930 TEMPREAL := REALPTR^.FIRSTREAL*FACTOR^.RE-IMAGPTR^.FIRSTREAL*FACTOR^.IM;
24940 IMAGPTR^.FIRSTREAL := REALPTR^.FIRSTREAL*FACTOR^.IM+IMAGPTR^.FIRSTREAL*FACTOR^.RE;
24950 REALPTR^.FIRSTREAL := TEMPREAL;
24960 IF FPTST(FACTOR^) THEN GARBAGE(FACTOR);
24970 CTIMSAB := DESTINATION
24980 END;
24990 (**)
25000 (**)
25010 FUNCTION CDIVAB(DESTINATION,DIVISOR: OBJECTP): OBJECTP;
25020 VAR REALPTR,IMAGPTR: UNDRESSP;
25030 TEMPREAL,DIVISORSQR: REAL;
25040 BEGIN
25050 REALPTR := SAFEACCESS(DESTINATION);
25060 IMAGPTR := INCPTR(REALPTR,SZREAL);
25070 DIVISORSQR := SQR(DIVISOR^.RE)+SQR(DIVISOR^.IM);
25080 TEMPREAL := (REALPTR^.FIRSTREAL*DIVISOR^.RE+IMAGPTR^.FIRSTREAL*DIVISOR^.IM)/DIVISORSQR;
25090 IMAGPTR^.FIRSTREAL := (IMAGPTR^.FIRSTREAL*DIVISOR^.RE-REALPTR^.FIRSTREAL*DIVISOR^.IM)/DIVISORSQR;
25100 REALPTR^.FIRSTREAL := TEMPREAL;
25110 IF FPTST(DIVISOR^) THEN GARBAGE(DIVISOR);
25120 CDIVAB := DESTINATION
25130 END;
25140 (**)
25150 (**)
25160 (*-02()
25170 BEGIN (* OF A68 *)
25180 END (* OF A68 *);
25190 ()-02*)
25200 (*+01()
25210 BEGIN (* OF MAIN PROGRAM *)
25220 END (* OF MAIN PROGRAM *).
25230 ()+01*)