Pristine Ack-5.5
[Ack-5.5.git] / lang / m2 / test / Wirth / PowersOf2.mod
1 MODULE PowersOf2;
2   FROM InOut IMPORT Write, WriteLn, WriteString, WriteCard;
3
4   CONST
5         M = 11;         (* M ~ N*log(2) *)
6         N = 32;
7   VAR
8         i,j,k,exp: CARDINAL;
9         c,r,t:  CARDINAL;
10         d: ARRAY [0..M] OF CARDINAL;
11         f: ARRAY[0..N] OF CARDINAL;
12   BEGIN
13         d[0] := 1;
14         k := 1;
15         FOR exp := 1 TO N DO
16                 (* compute d = 2 ^ exp by d = 2*d *)
17                 c := 0;         (* carry *)
18                 FOR i := 0 TO k-1 DO
19                         t := 2 * d[i] + c;
20                         IF t >= 10 THEN
21                                 d[i] := t - 10;
22                                 c := 1;
23                         ELSE
24                                 d[i] := t;
25                                 c := 0;
26                         END
27                 END;
28                 IF c > 0 THEN
29                         d[k] := 1;
30                         k := k + 1
31                 END;
32                 (* output d[k-1] .. d[0] *)
33                 i := M;
34                 REPEAT
35                         i := i - 1; 
36                         Write(" ")
37                 UNTIL i = k;
38                 REPEAT
39                         i := i - 1;
40                         Write(CHR(d[i]+ORD("0")))
41                 UNTIL i = 0;
42                 WriteCard(exp, 4);
43                 (* compute and output f = 2^(-exp) by f := f DIV 2 *)
44                 WriteString(" 0.");
45                 r := 0;         (* remainder *)
46                 FOR j := 1 TO exp-1 DO
47                         r := 10 * r + f[j];
48                         f[j] := r DIV 2;
49                         r := r MOD 2;
50                         Write(CHR(f[j]+ORD("0")))
51                 END;
52                 f[exp] := 5;
53                 Write("5");
54                 WriteLn
55         END
56   END PowersOf2.
57