NUMBERS.MOD 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. IMPLEMENTATION MODULE Numbers;
  2. (*
  3. * REPERTOIRE
  4. * Release 1.6
  5. * By Charles Bradford and Cole Brecheen
  6. * (c) Copyright 1985-1992 PMI
  7. * Green Bay, Wisconsin
  8. * All rights reserved
  9. * (414) 468-6040
  10. *
  11. * $Header: D:/logfiles/mods/numbers.mov 1.5 10 Mar 1991 15:31:10 coleb $
  12. *
  13. *)
  14. IMPORT NumTypes;
  15. VAR
  16. Initialized : BOOLEAN;
  17. PROCEDURE Init();
  18. BEGIN
  19. IF Initialized THEN
  20. RETURN;
  21. ELSE
  22. Initialized := TRUE;
  23. END;
  24. NumTypes.Init();
  25. END Init;
  26. TYPE
  27. LongConverter =
  28. RECORD
  29. CASE : BOOLEAN OF
  30. TRUE: long: LONGINT;
  31. | FALSE: locard, hicard: CARDINAL;
  32. END;
  33. END;
  34. PROCEDURE Between(min, x, max : CARDINAL) : CARDINAL;
  35. BEGIN
  36. IF min > max THEN
  37. max := min;
  38. END;
  39. IF x > max THEN
  40. RETURN max;
  41. ELSIF x < min THEN
  42. RETURN min;
  43. ELSE
  44. RETURN x;
  45. END;
  46. END Between;
  47. PROCEDURE C( num: LONGINT ): CARDINAL;
  48. BEGIN
  49. RETURN VAL( CARDINAL, num );
  50. END C;
  51. PROCEDURE I( num: LONGINT ): INTEGER;
  52. BEGIN
  53. RETURN VAL( INTEGER, num );
  54. END I;
  55. PROCEDURE CardIsBetween(min, x, max: CARDINAL): BOOLEAN;
  56. BEGIN
  57. RETURN (x >= min) AND (x <= max);
  58. END CardIsBetween;
  59. PROCEDURE CardSqrt( n: CARDINAL ): CARDINAL;
  60. VAR a2,b2,ab,t: CARDINAL;
  61. BEGIN
  62. a2 := 0;
  63. ab :=0;
  64. b2 := 1;
  65. WHILE b2 <= n DO
  66. b2 := 4*b2
  67. END;
  68. WHILE b2 # 1 DO
  69. ab := ab DIV 2;
  70. b2 := b2 DIV 4;
  71. t := a2 + 2*ab + b2;
  72. IF t <= n THEN
  73. a2 := t;
  74. ab := ab+b2;
  75. END
  76. END;
  77. RETURN ab;
  78. END CardSqrt;
  79. PROCEDURE IntIsBetween(min, x, max: INTEGER): BOOLEAN;
  80. BEGIN
  81. RETURN (x >= min) AND (x <= max);
  82. END IntIsBetween;
  83. PROCEDURE IntMin(first, second : INTEGER) : INTEGER;
  84. BEGIN
  85. IF first<second THEN
  86. RETURN (first);
  87. ELSE
  88. RETURN (second);
  89. END;
  90. END IntMin;
  91. PROCEDURE IntMax(first, second : INTEGER) : INTEGER;
  92. BEGIN
  93. IF first>second THEN
  94. RETURN (first);
  95. ELSE
  96. RETURN (second);
  97. END;
  98. END IntMax;
  99. PROCEDURE Lc( num: CARDINAL ): LONGINT;
  100. BEGIN
  101. RETURN VAL( LONGINT, num );
  102. END Lc;
  103. PROCEDURE Li( num: INTEGER ): LONGINT;
  104. BEGIN
  105. RETURN VAL( LONGINT, num );
  106. END Li;
  107. PROCEDURE LowestCommonDenom(n1, n2 : INTEGER) : INTEGER;
  108. BEGIN
  109. n1 := ABS(n1);
  110. n2 := ABS(n2);
  111. WHILE n1#n2 DO
  112. IF n1 > n2 THEN
  113. n1 := n1-n2;
  114. ELSE
  115. n2 := n2-n1;
  116. END;
  117. END;
  118. RETURN n1;
  119. END LowestCommonDenom;
  120. PROCEDURE Min(first, second : CARDINAL) : CARDINAL;
  121. BEGIN
  122. IF first<second THEN
  123. RETURN (first);
  124. ELSE
  125. RETURN (second);
  126. END;
  127. END Min;
  128. PROCEDURE Max(first, second : CARDINAL) : CARDINAL;
  129. BEGIN
  130. IF first>second THEN
  131. RETURN (first);
  132. ELSE
  133. RETURN (second);
  134. END;
  135. END Max;
  136. PROCEDURE Power(x, n : CARDINAL) : CARDINAL;
  137. (*Returns x raised to the nth power.*)
  138. VAR
  139. w, z, i : CARDINAL;
  140. BEGIN
  141. w := x;
  142. i := n;
  143. z := 1;
  144. WHILE i<>0 DO
  145. IF ODD(i) THEN
  146. z := z*w;
  147. END;
  148. i := i DIV 2;
  149. IF i<>0 THEN
  150. w := w*w;
  151. END;
  152. END;
  153. RETURN (z);
  154. END Power;
  155. (*These two procedures look stupid, but the compilers are
  156. inconsistent about whether you can use VAL, TRUNC, and FLOAT to
  157. convert between reals, integers and longints. This conversion method
  158. works with all M2 compilers.*)
  159. PROCEDURE R8ToL( x: NumTypes.Real8 ): LONGINT;
  160. BEGIN
  161. IF x <= 65535.0 THEN
  162. RETURN Lc( TRUNC(x) );
  163. ELSE
  164. RETURN Lc(TRUNC(x / 65535.0)) * NumTypes.L65535;
  165. END
  166. END R8ToL;
  167. PROCEDURE LToR8( TheLong: LONGINT ): NumTypes.Real8;
  168. VAR
  169. tmpreal: REAL;
  170. tmpr8: NumTypes.Real8;
  171. BEGIN
  172. IF TheLong <= NumTypes.L65535 THEN
  173. tmpreal := FLOAT( C(TheLong) );
  174. ELSE
  175. TheLong := TheLong DIV NumTypes.L65535;
  176. tmpreal := FLOAT( C(TheLong) ) * 65535.0;
  177. END;
  178. tmpr8 := NumTypes.REALToReal8(tmpreal);
  179. RETURN tmpr8;
  180. END LToR8;
  181. PROCEDURE R8ToInt( x: NumTypes.Real8 ): INTEGER;
  182. BEGIN
  183. (*Let the RTS worry about errors here.*)
  184. RETURN TRUNC(x);
  185. END R8ToInt;
  186. PROCEDURE IntToR8( TheInt: INTEGER ): NumTypes.Real8;
  187. VAR
  188. tmpreal: REAL;
  189. tmpr8: NumTypes.Real8;
  190. BEGIN
  191. tmpreal := FLOAT( TheInt );
  192. tmpr8 := NumTypes.REALToReal8(tmpreal);
  193. RETURN tmpr8;
  194. END IntToR8;
  195. BEGIN
  196. Initialized := FALSE;
  197. Init();
  198. END Numbers.