forked from KolibriOS/kolibrios
117 lines
2.0 KiB
Plaintext
117 lines
2.0 KiB
Plaintext
|
(*
|
||
|
adapted to Oberon-07 by 0CodErr, KolibriOS team
|
||
|
*)
|
||
|
(* Print first 'PRINT' digits of 'e'.
|
||
|
*
|
||
|
* Originally written in Pascal by Scott Hemphill
|
||
|
* Rewritten in Modula-2 and modified by Andrew Cadach
|
||
|
*
|
||
|
*)
|
||
|
|
||
|
MODULE exp;
|
||
|
|
||
|
IMPORT In, Out, Console;
|
||
|
|
||
|
|
||
|
CONST
|
||
|
PRINT = 1024;
|
||
|
DIGITS = PRINT + (PRINT + 31) DIV 32;
|
||
|
|
||
|
|
||
|
TYPE
|
||
|
number = ARRAY DIGITS + 1 OF INTEGER;
|
||
|
|
||
|
|
||
|
VAR
|
||
|
s, x: number;
|
||
|
xs, i: INTEGER;
|
||
|
|
||
|
|
||
|
PROCEDURE init (VAR x: number; n: INTEGER);
|
||
|
VAR
|
||
|
i: INTEGER;
|
||
|
|
||
|
BEGIN
|
||
|
x[0] := n;
|
||
|
FOR i := 1 TO DIGITS DO x[i] := 0 END
|
||
|
END init;
|
||
|
|
||
|
|
||
|
PROCEDURE divide (VAR x: number; xs, n: INTEGER;
|
||
|
VAR y: number; VAR ys: INTEGER);
|
||
|
VAR
|
||
|
i, c: INTEGER;
|
||
|
|
||
|
BEGIN
|
||
|
c := 0;
|
||
|
FOR i := xs TO DIGITS DO
|
||
|
c := 10 * c + x[i];
|
||
|
y[i] := c DIV n;
|
||
|
c := c MOD n
|
||
|
END;
|
||
|
ys := xs;
|
||
|
WHILE (ys <= DIGITS) & (y[ys] = 0) DO INC(ys) END
|
||
|
END divide;
|
||
|
|
||
|
|
||
|
PROCEDURE add (VAR s, x: number; xs: INTEGER);
|
||
|
VAR
|
||
|
i, c: INTEGER;
|
||
|
BEGIN
|
||
|
c := 0;
|
||
|
FOR i := DIGITS TO xs BY -1 DO
|
||
|
c := c + s[i] + x[i];
|
||
|
IF c >= 10 THEN
|
||
|
s[i] := c - 10;
|
||
|
c := 1
|
||
|
ELSE
|
||
|
s[i] := c;
|
||
|
c := 0
|
||
|
END
|
||
|
END;
|
||
|
i := xs;
|
||
|
WHILE c # 0 DO
|
||
|
DEC(i);
|
||
|
c := c + s[i];
|
||
|
IF c >= 10 THEN
|
||
|
s[i] := c - 10;
|
||
|
c := 1
|
||
|
ELSE
|
||
|
s[i] := c;
|
||
|
c := 0
|
||
|
END
|
||
|
END
|
||
|
END add;
|
||
|
|
||
|
|
||
|
BEGIN
|
||
|
Console.open;
|
||
|
|
||
|
init(s, 0);
|
||
|
init(x, 1);
|
||
|
xs := 0;
|
||
|
add(s, x, xs);
|
||
|
i := 0;
|
||
|
REPEAT
|
||
|
INC(i);
|
||
|
divide(x, xs, i, x, xs);
|
||
|
add(s, x, xs);
|
||
|
UNTIL xs > DIGITS;
|
||
|
Out.Ln;
|
||
|
Out.String (" e = ");
|
||
|
Out.Char (CHR(s[0] + ORD("0")));
|
||
|
Out.Char (".");
|
||
|
FOR i := 1 TO PRINT DO
|
||
|
Out.Char (CHR(s[i] + ORD("0")));
|
||
|
IF i MOD 64 = 0 THEN
|
||
|
Out.Ln;
|
||
|
Out.Int (i, 5);
|
||
|
Out.String (" ")
|
||
|
END
|
||
|
END;
|
||
|
Out.Ln;
|
||
|
Out.Ln;
|
||
|
In.Ln;
|
||
|
|
||
|
Console.exit(TRUE)
|
||
|
END exp.
|