[Back to MATH SWAG index] [Back to Main SWAG index] [Original]

    {
    LOU DUCHEZ

    ATTENTION, whoever was trying to calculate PI!  Here's a swell program,
    as a follow-up to a recent post of mine about approximating techniques!

    }

    program calcpi;  { Calculates pi by getting the area of one-quarter of a
                       circle of radius 1, and then multiplying by 4.  The area
                       is an approximation, derived by Simpson's method: see
                       previous post for explanation of that technique. }

    uses
      crt;

    const
      lowerbound  = 0;  { The interval we're evaluating is from 0 to 1. }
      higherbound = 1;  { I put the 0 and 1 here for clarity. }

    var
      incs    : word;
      quartpi,
      h, x    : real;

    function y(x : real) : real;  { Feed it an x-value, and it tells you the }
    begin                         { corresponding y-value on the unit circle. }
      y := sqrt(1 - x * x);       { A no-brainer. }
    end;

    begin
      { I leave you to do the error-checking on input. }
      clrscr;
      write('Enter a WORD (1 - 32767) for the number of parabolas to do: ');
      readln(incs);

      { The answer for a quarter of pi will be accumulated into QuartPi. }
      quartpi := 0;

      { H is the interval to increment on.  X is the "middle" x value for each
        parabola in Simpson's method.  Here it is set equal to one interval
        above the lower bound: Simpson's method looks at points on either side
        of "X", so my reasoning is obvious.  Note also that, by magical
        coincidence, the last evaluation will have "X" equal to the higher
        bound of the interval minus H. }

      h := (higherbound - lowerbound) / (1 + 2 * incs);
      x := lowerbound + h;

      { This loop accumulates a value for pi/4. }
      while incs > 0 do
      begin
        if x < 0 then
          x := 0;
        quartpi := quartpi + y(x - h) + 4 * y(x) + y(x + h);

        { Move X two increments to the right, and decrease the number of parabolas
          we still have to do. }
        x := x + 2 * h;
        dec(incs);
      end;

      { Simpson's method has you multiply the sum by H/3. }
      quartpi := h * quartpi / 3;

      { Print answer. }
      writeln(4 * quartpi : 12 : 8);
      writeln('This has been a display of Simpson''s method.  D''ohh!');
    end.

[Back to MATH SWAG index] [Back to Main SWAG index] [Original]