| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- 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 first<second THEN
- 102 RETURN (first);
- 103 ELSE
- 104 RETURN (second);
- 105 END;
- 106 END IntMin;
- 107
- 108 PROCEDURE IntMax(first, second : INTEGER) : INTEGER;
- 109 BEGIN
- 110 IF first>second 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 first<second THEN
- 146 RETURN (first);
- 147 ELSE
- 148 RETURN (second);
- 149 END;
- 150 END Min;
- 151
- 152 PROCEDURE Max(first, second : CARDINAL) : CARDINAL;
- 153 BEGIN
- 154 IF first>second 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
|