58 lines
1,010 B
Modula-2
58 lines
1,010 B
Modula-2
MODULE PowersOf2;
|
|
FROM InOut IMPORT Write, WriteLn, WriteString, WriteCard;
|
|
|
|
CONST
|
|
M = 11; (* M ~ N*log(2) *)
|
|
N = 32;
|
|
VAR
|
|
i,j,k,exp: CARDINAL;
|
|
c,r,t: CARDINAL;
|
|
d: ARRAY [0..M] OF CARDINAL;
|
|
f: ARRAY[0..N] OF CARDINAL;
|
|
BEGIN
|
|
d[0] := 1;
|
|
k := 1;
|
|
FOR exp := 1 TO N DO
|
|
(* compute d = 2 ^ exp by d = 2*d *)
|
|
c := 0; (* carry *)
|
|
FOR i := 0 TO k-1 DO
|
|
t := 2 * d[i] + c;
|
|
IF t >= 10 THEN
|
|
d[i] := t - 10;
|
|
c := 1;
|
|
ELSE
|
|
d[i] := t;
|
|
c := 0;
|
|
END
|
|
END;
|
|
IF c > 0 THEN
|
|
d[k] := 1;
|
|
k := k + 1
|
|
END;
|
|
(* output d[k-1] .. d[0] *)
|
|
i := M;
|
|
REPEAT
|
|
i := i - 1;
|
|
Write(" ")
|
|
UNTIL i = k;
|
|
REPEAT
|
|
i := i - 1;
|
|
Write(CHR(d[i]+ORD("0")))
|
|
UNTIL i = 0;
|
|
WriteCard(exp, 4);
|
|
(* compute and output f = 2^(-exp) by f := f DIV 2 *)
|
|
WriteString(" 0.");
|
|
r := 0; (* remainder *)
|
|
FOR j := 1 TO exp-1 DO
|
|
r := 10 * r + f[j];
|
|
f[j] := r DIV 2;
|
|
r := r MOD 2;
|
|
Write(CHR(f[j]+ORD("0")))
|
|
END;
|
|
f[exp] := 5;
|
|
Write("5");
|
|
WriteLn
|
|
END
|
|
END PowersOf2.
|
|
|