43 lines
1.3 KiB
Plaintext
43 lines
1.3 KiB
Plaintext
/* Uses the algorithm of S. Rabinowicz and S. Wagon, "A Spigot Algorithm */
|
|
/* for the Digits of Pi". */
|
|
(subrg, fofl, size):
|
|
Pi_Spigot: procedure options (main); /* 21 January 2012. */
|
|
declare (n, len) fixed binary;
|
|
|
|
n = 1000;
|
|
len = 10*n / 3;
|
|
begin;
|
|
declare ( i, j, k, q, nines, predigit ) fixed binary;
|
|
declare x fixed binary (31);
|
|
declare a(len) fixed binary (31);
|
|
|
|
a = 2; /* Start with 2s */
|
|
nines, predigit = 0; /* First predigit is a 0 */
|
|
do j = 1 to n;
|
|
q = 0;
|
|
do i = len to 1 by -1; /* Work backwards */
|
|
x = 10*a(i) + q*i;
|
|
a(i) = mod (x, (2*i-1));
|
|
q = x / (2*i-1);
|
|
end;
|
|
a(1) = mod(q, 10); q = q / 10;
|
|
if q = 9 then nines = nines + 1;
|
|
else if q = 10 then
|
|
do;
|
|
put edit(predigit+1) (f(1));
|
|
do k = 1 to nines;
|
|
put edit ('0')(a(1)); /* zeros */
|
|
end;
|
|
predigit, nines = 0;
|
|
end;
|
|
else
|
|
do;
|
|
put edit(predigit) (f(1)); predigit = q;
|
|
do k = 1 to nines; put edit ('9')(a(1)); end;
|
|
nines = 0;
|
|
end;
|
|
end;
|
|
put edit(predigit) (f(1));
|
|
end; /* of begin block */
|
|
end Pi_Spigot;
|