ComplexNumbers.Mod 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. MODULE ComplexNumbers;
  2. (*
  3. operators for complex numbers
  4. this module is automatically loaded (FoxSemanticChecker) when operators on complex numbers are encountered
  5. *)
  6. IMPORT Math, MathL;
  7. OPERATOR "+"*(CONST left, right: COMPLEX): COMPLEX;
  8. VAR result: COMPLEX;
  9. BEGIN
  10. RE(result) := RE(left) + RE(right);
  11. IM(result) := IM(left) + IM(right);
  12. RETURN result
  13. END "+";
  14. OPERATOR "+"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
  15. VAR result: LONGCOMPLEX;
  16. BEGIN
  17. RE(result) := RE(left) + RE(right);
  18. IM(result) := IM(left) + IM(right);
  19. RETURN result
  20. END "+";
  21. OPERATOR "-"*(CONST left, right: COMPLEX): COMPLEX;
  22. VAR result: COMPLEX;
  23. BEGIN
  24. RE(result) := RE(left) - RE(right);
  25. IM(result) := IM(left) - IM(right);
  26. RETURN result
  27. END "-";
  28. OPERATOR "-"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
  29. VAR result: LONGCOMPLEX;
  30. BEGIN
  31. RE(result) := RE(left) - RE(right);
  32. IM(result) := IM(left) - IM(right);
  33. RETURN result
  34. END "-";
  35. OPERATOR "*"*(CONST left, right: COMPLEX): COMPLEX;
  36. VAR result: COMPLEX;
  37. BEGIN
  38. RE(result) := RE(left) * RE(right) - IM(left) * IM(right);
  39. IM(result) := RE(left) * IM(right) + IM(left) * RE(right);
  40. RETURN result
  41. END "*";
  42. OPERATOR "*"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
  43. VAR result: LONGCOMPLEX;
  44. BEGIN
  45. RE(result) := RE(left) * RE(right) - IM(left) * IM(right);
  46. IM(result) := RE(left) * IM(right) + IM(left) * RE(right);
  47. RETURN result
  48. END "*";
  49. OPERATOR "/"*(CONST left, right: COMPLEX): COMPLEX;
  50. VAR result: COMPLEX; iDivisor: REAL;
  51. BEGIN
  52. iDivisor := 1.0 / (RE(right) * RE(right) + IM(right) * IM(right));
  53. RE(result) := (RE(left) * RE(right) + IM(left) * IM(right)) * iDivisor;
  54. IM(result) := (IM(left) * RE(right) - RE(left) * IM(right)) * iDivisor;
  55. RETURN result
  56. END "/";
  57. OPERATOR "/"*(CONST left, right: LONGCOMPLEX): LONGCOMPLEX;
  58. VAR result: LONGCOMPLEX; iDivisor: LONGREAL;
  59. BEGIN
  60. iDivisor := 1.0D0 / (RE(right) * RE(right) + IM(right) * IM(right));
  61. RE(result) := (RE(left) * RE(right) + IM(left) * IM(right)) * iDivisor;
  62. IM(result) := (IM(left) * RE(right) - RE(left) * IM(right)) * iDivisor;
  63. RETURN result
  64. END "/";
  65. OPERATOR "ABS"*(CONST arg: COMPLEX): REAL;
  66. BEGIN RETURN Math.sqrt(RE(arg) * RE(arg) + IM(arg) * IM(arg))
  67. END "ABS";
  68. OPERATOR "ABS"*(CONST arg: LONGCOMPLEX): LONGREAL;
  69. BEGIN RETURN MathL.sqrt(RE(arg) * RE(arg) + IM(arg) * IM(arg))
  70. END "ABS";
  71. OPERATOR "~"*(CONST left: COMPLEX): COMPLEX;
  72. BEGIN
  73. RETURN RE(left) - IM(left) * IMAG
  74. END "~";
  75. OPERATOR "~"*(CONST left: LONGCOMPLEX): LONGCOMPLEX;
  76. BEGIN
  77. RETURN RE(left) - IM(left) * IMAG
  78. END "~";
  79. OPERATOR "<="*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) <= ABS(y); END "<=";
  80. OPERATOR ">="*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) >= ABS(y); END ">=";
  81. OPERATOR "<"*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) < ABS(y); END "<";
  82. OPERATOR ">"*(CONST x, y: COMPLEX): BOOLEAN; BEGIN RETURN ABS(x) > ABS(y); END ">";
  83. OPERATOR "<="*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) <= ABS(y); END "<=";
  84. OPERATOR ">="*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) >= ABS(y); END ">=";
  85. OPERATOR "<"*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) < ABS(y); END "<";
  86. OPERATOR ">"*(CONST x, y: LONGCOMPLEX): BOOLEAN; BEGIN RETURN ABS(x) > ABS(y); END ">";
  87. END ComplexNumbers.