home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / xc212os2.zip / SAMPLES / SIMPLE / exp.ob2 < prev    next >
Text File  |  1995-01-31  |  2KB  |  103 lines

  1. (* Print first 'PRINT' digits of 'e'.
  2.  *
  3.  * Originally written in Pascal by Scott Hemphill
  4.  * Rewritten in Oberon-2 and modified by Andrew Cadach
  5.  *
  6.  *)
  7.  
  8. <*- CHECKINDEX *>
  9. <*+ MAIN *>
  10. MODULE exp;
  11.  
  12. IMPORT InOut;
  13.  
  14. CONST
  15.    PRINT = 1024;
  16.    DIGITS = PRINT + (PRINT+31) DIV 32;
  17.  
  18. TYPE Number = ARRAY DIGITS+1 OF INTEGER;
  19.  
  20. VAR
  21.    s, x: POINTER TO Number;
  22.    xs, i: INTEGER;
  23.  
  24. PROCEDURE init (VAR x: Number; n: INTEGER);
  25. VAR i: INTEGER;
  26. BEGIN
  27.    x[0] := n;
  28.    FOR i := 1 TO DIGITS DO x[i] := 0; END
  29. END init;
  30.  
  31. PROCEDURE divide (VAR x: Number; xs, n: INTEGER;
  32.                   VAR y: Number; VAR ys: INTEGER);
  33. VAR
  34.    i, c: INTEGER;
  35. BEGIN
  36.    c := 0;
  37.    FOR i := xs TO DIGITS DO
  38.       c := 10*c + x[i];
  39.       y[i] := c DIV n;
  40.       c := c MOD n
  41.    END;
  42.    ys := xs;
  43.    WHILE (ys <= DIGITS) & (y[ys] = 0) DO INC (ys) END
  44. END divide;
  45.  
  46. PROCEDURE add (VAR s, x: Number; xs: INTEGER);
  47. VAR
  48.    i, c: INTEGER;
  49. BEGIN
  50.    c := 0;
  51.    FOR i := DIGITS TO xs BY -1 DO
  52.       INC (c,  s[i] + x[i]);
  53.       IF c >= 10 THEN
  54.          s[i] := c - 10;
  55.          c := 1
  56.       ELSE
  57.          s[i] := c;
  58.          c := 0
  59.       END
  60.    END;
  61.    i := xs;
  62.    WHILE c # 0 DO
  63.       DEC (i);
  64.       INC (c, s[i]);
  65.       IF c >= 10 THEN
  66.          s[i] := c - 10;
  67.          c := 1
  68.       ELSE
  69.          s[i] := c;
  70.          c := 0
  71.       END
  72.    END
  73. END add;
  74.  
  75. BEGIN
  76.    NEW (s);
  77.    NEW (x);
  78.    init (s^, 0);
  79.    init (x^, 1);
  80.    xs := 0;
  81.    add (s^, x^, xs);
  82.    i := 0;
  83.    REPEAT
  84.       INC (i);
  85.       divide (x^, xs, i, x^, xs);
  86.       add (s^, x^, xs);
  87.    UNTIL xs > DIGITS;
  88.    InOut.WriteLn;
  89.    InOut.WriteString ("   e = ");
  90.    InOut.Write (CHR (s^[0]+ORD ('0')));
  91.    InOut.Write ('.');
  92.    FOR i := 1 TO PRINT DO
  93.       InOut.Write (CHR (s^[i]+ORD ('0')));
  94.       IF i MOD 64 = 0 THEN
  95.         InOut.WriteLn;
  96.         InOut.WriteInt (i, 5);
  97.         InOut.WriteString ("    ")
  98.       END;
  99.    END;
  100.    InOut.WriteLn;
  101.    InOut.WriteLn;
  102. END exp.
  103.