123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- MODULE ComplexNumbers;
- (*
- operators for complex numbers
- this module is automatically loaded (FoxSemanticChecker) when operators on complex numbers are encountered
- *)
- IMPORT Math, MathL;
- OPERATOR "+"*(CONST left, right: COMPLEX): COMPLEX;
- VAR result: COMPLEX;
- BEGIN
- RE(result) := RE(left) + RE(right);
- IM(result) := IM(left) + IM(right);
- RETURN result
- END "+";
- OPERATOR "+"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
- VAR result: LONGCOMPLEX;
- BEGIN
- RE(result) := RE(left) + RE(right);
- IM(result) := IM(left) + IM(right);
- RETURN result
- END "+";
- OPERATOR "-"*(CONST left, right: COMPLEX): COMPLEX;
- VAR result: COMPLEX;
- BEGIN
- RE(result) := RE(left) - RE(right);
- IM(result) := IM(left) - IM(right);
- RETURN result
- END "-";
- OPERATOR "-"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
- VAR result: LONGCOMPLEX;
- BEGIN
- RE(result) := RE(left) - RE(right);
- IM(result) := IM(left) - IM(right);
- RETURN result
- END "-";
- OPERATOR "*"*(CONST left, right: COMPLEX): COMPLEX;
- VAR result: COMPLEX;
- BEGIN
- RE(result) := RE(left) * RE(right) - IM(left) * IM(right);
- IM(result) := RE(left) * IM(right) + IM(left) * RE(right);
- RETURN result
- END "*";
- OPERATOR "*"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
- VAR result: LONGCOMPLEX;
- BEGIN
- RE(result) := RE(left) * RE(right) - IM(left) * IM(right);
- IM(result) := RE(left) * IM(right) + IM(left) * RE(right);
- RETURN result
- END "*";
- OPERATOR "/"*(CONST left, right: COMPLEX): COMPLEX;
- VAR result: COMPLEX; iDivisor: REAL;
- BEGIN
- iDivisor := 1.0 / (RE(right) * RE(right) + IM(right) * IM(right));
- RE(result) := (RE(left) * RE(right) + IM(left) * IM(right)) * iDivisor;
- IM(result) := (IM(left) * RE(right) - RE(left) * IM(right)) * iDivisor;
- RETURN result
- END "/";
- OPERATOR "/"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
- VAR result: LONGCOMPLEX; iDivisor: LONGREAL;
- BEGIN
- iDivisor := 1.0D0 / (RE(right) * RE(right) + IM(right) * IM(right));
- RE(result) := (RE(left) * RE(right) + IM(left) * IM(right)) * iDivisor;
- IM(result) := (IM(left) * RE(right) - RE(left) * IM(right)) * iDivisor;
- RETURN result
- END "/";
- OPERATOR "ABS"*(CONST arg: COMPLEX): REAL;
- BEGIN RETURN Math.sqrt(RE(arg) * RE(arg) + IM(arg) * IM(arg))
- END "ABS";
- OPERATOR "ABS"*(CONST arg: LONGCOMPLEX): LONGREAL;
- BEGIN RETURN MathL.sqrt(RE(arg) * RE(arg) + IM(arg) * IM(arg))
- END "ABS";
- OPERATOR "~"*(CONST left: COMPLEX): COMPLEX;
- BEGIN
- RETURN RE(left) - IM(left) * IMAG
- END "~";
- OPERATOR "~"*(CONST left: LONGCOMPLEX): LONGCOMPLEX;
- BEGIN
- RETURN RE(left) - IM(left) * IMAG
- END "~";
- OPERATOR "<="*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) <= ABS(y); END "<=";
- OPERATOR ">="*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) >= ABS(y); END ">=";
- OPERATOR "<"*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) < ABS(y); END "<";
- OPERATOR ">"*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) > ABS(y); END ">";
- OPERATOR "<="*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) <= ABS(y); END "<=";
- OPERATOR ">="*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) >= ABS(y); END ">=";
- OPERATOR "<"*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) < ABS(y); END "<";
- OPERATOR ">"*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) > ABS(y); END ">";
- END ComplexNumbers.
|