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