NUMBERS.LST 6.4 KB

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