home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* *)
- (* Amiga Oberon Interface Module: COMPLEX Date: 02-Nov-92 *)
- (* *)
- (* © 1992 by Fridtjof Siebert *)
- (* *)
- (*-------------------------------------------------------------------------*)
-
- MODULE COMPLEX;
-
- IMPORT BT * := BasicTypes, MATHLIB, math := MathIEEEDoubBas;
-
- TYPE
- COMPLEX * = POINTER TO COMPLEXDesc;
-
- COMPLEXDesc * = RECORD (BT.FIELDDesc)
- re-,im-: LONGREAL;
- END;
-
-
- PROCEDURE Create * (re,im: LONGREAL): COMPLEX;
- (*
- * ensure
- * Result.re=re;
- * Result.im=im;
- *)
-
- VAR
- c: COMPLEX;
-
- BEGIN
- NEW(c);
- c.re := re;
- c.im := im;
- RETURN c;
- END Create;
-
-
- PROCEDURE (m: COMPLEX) Add * (n: BT.GROUP): BT.GROUP;
- BEGIN
- WITH n: COMPLEX DO
- RETURN Create(m.re+n.re,m.im+n.im);
- END;
- END Add;
-
-
- PROCEDURE (m: COMPLEX) Neg * (): BT.GROUP;
- BEGIN
- RETURN Create(-m.re,-m.im);
- END Neg;
-
-
- PROCEDURE (m: COMPLEX) Sub * (n: BT.GROUP): BT.GROUP;
- BEGIN
- WITH n: COMPLEX DO
- RETURN Create(m.re-n.re,m.im-n.im);
- END;
- END Sub;
-
-
- PROCEDURE (m: COMPLEX) Norm * (): LONGREAL;
- BEGIN
- RETURN MATHLIB.SQRT(MATHLIB.SQR(m.re) + MATHLIB.SQR(m.im));
- END Norm;
-
-
- PROCEDURE (m: COMPLEX) Mul * (n: BT.RING): BT.RING;
- BEGIN
- WITH n: COMPLEX DO
- RETURN Create(m.re*n.re - m.im * n.im,
- m.im*n.re + m.re * n.im);
- END;
- END Mul;
-
-
- PROCEDURE (m: COMPLEX) InvAllowed * (): BOOLEAN;
- BEGIN
- RETURN (m.re#0) OR (m.im#0);
- END InvAllowed;
-
-
- PROCEDURE (m: COMPLEX) Inv * (): BT.FIELD;
- VAR
- l: LONGREAL;
- BEGIN
- l := MATHLIB.SQR(m.re) + MATHLIB.SQR(m.im);
- RETURN Create( m.re / l, - m.im / l);
- END Inv;
-
-
- PROCEDURE (m: COMPLEX) Div * (n: BT.FIELD): BT.FIELD;
- VAR
- l: LONGREAL;
- BEGIN
-
- WITH n: COMPLEX DO
- l := MATHLIB.SQR(n.re) + MATHLIB.SQR(n.im);
- RETURN Create( (m.re*n.re + m.im*n.im) / l,
- (m.im*n.re - m.re*n.im) / l);
- END;
- END Div;
-
-
- PROCEDURE (m: COMPLEX) isEqual * (n: BT.COMPAREABLE): BOOLEAN; (* a = b *)
- BEGIN
- WITH n: COMPLEX DO
- RETURN (m.re=n.re) & (m.im=n.im);
- END;
- END isEqual;
-
-
- PROCEDURE (m: COMPLEX) Compare * (n: BT.COMPAREABLE): LONGINT;
- VAR
- nm,nn: LONGREAL;
- BEGIN
- nm := m.Norm(); nn := n(COMPLEX).Norm();
- IF nm = nn THEN
- RETURN 0
- ELSIF nm > nn THEN
- RETURN 1
- ELSE
- RETURN -1
- END;
- END Compare;
-
-
- PROCEDURE (m: COMPLEX) Argument * (): LONGREAL;
- (*
- * Determines Argument of m.
- *
- * m = m.Norm*(cos(m.Argument()) + i*sin(m.Argument())
- *)
-
- VAR
- arg: LONGREAL;
-
- BEGIN
- IF m.re=0 THEN
- IF m.im>0 THEN
- arg := math.pi2;
- ELSE
- arg := -math.pi2;
- END;
- ELSE
- arg := MATHLIB.ATAN(m.im/m.re);
- IF m.re<0 THEN
- arg := arg + math.pi;
- END;
- END;
- RETURN arg;
- END Argument;
-
-
- END COMPLEX.
-
-