#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <float.h>
const long PRECISION = 2000;
const int CALC_PREC = 7;
const int PRINT_FROM = 0;
const int PRINT_TO = 1000;
long base;
long last;
void add(long z[], long x[], long y[])
{
long i, t, r = 0;
for (i = last; i >= 0; --i) {
t = x[i] + y[i] + r;
r = t / base;
z[i] = t - r * base;
}
}
void sub(long z[], long x[], long y[])
{
long i, t, r = 1;
for (i = last; i >= 0; --i) {
t = x[i] + (base - y[i] - 1) + r;
r = t / base;
z[i] = t - r * base;
}
}
void mul(long z[], long x[], long k)
{
long i, t, r = 0;
for (i = last; i >= 0; --i) {
t = x[i] * k + r;
r = t / base;
z[i] = t - r * base;
}
}
void dvd(long z[], long x[], long k)
{
long i, r = 0;
double t;
for (i = 0; i <= last; ++i) {
t = x[i] + (double)r * base;
z[i] = t / k;
r = t - (double)k * z[i];
}
}
void arctan(long z[], long k)
{
static long* u = 0, *t;
long i;
if (!u) {
t = malloc((last + 1) * sizeof(long));
u = calloc(last + 1, sizeof(long));
u[0] = 1;
}
memset(z, 0, (last + 1) * sizeof(long));
for (i = (long)(0.5 * PRECISION / log10(k)) + 1; i >= 1; --i) {
dvd(t, u, 2 * i + 1);
sub(z, t, z);
dvd(z, z, k);
dvd(z, z, k);
}
sub(z, u, z);
dvd(z, z, k);
}
void print(long x[], size_t i_start, size_t i_end)
{
long i, s;
if (i_start == 0)
printf("PI=3.\n");
else
--i_start;
i = i_start / 50 * 50;
s = base / pow(10, i % CALC_PREC);
for (; i < i_end && i < PRECISION; ++i) {
s /= 10;
if (i >= i_start) {
if (i % 1000 == 0)
putchar('\n');
printf("%ld", (x[i / CALC_PREC + 1] / s) % 10);
}
else
putchar(' ');
if (i % 50 == 49)
putchar('\n');
else if (i % 10 == 9)
putchar(' ');
if (s == 1)
s = base;
}
if (i % 50 != 0)
putchar('\n');
}
int main()
{
long *x, *y, *z, *w;
base = pow(10, CALC_PREC);
last = ceil((double)PRECISION / CALC_PREC) + 1;
x = malloc((last + 1) * sizeof(long));
y = malloc((last + 1) * sizeof(long));
z = malloc((last + 1) * sizeof(long));
w = malloc((last + 1) * sizeof(long));
arctan(x, 2);
arctan(y, 5);
arctan(z, 8);
mul(x, x, 4);
mul(y, y, 4);
mul(z, z, 4);
add(x, x, y);
add(x, x, z);
add(x, x, w);
print(x, PRINT_FROM, PRINT_TO);
return 0;
}
/* 4a(1/2)+4a(1/5)+4a(1/8) */