/* pi-multiple precision */ /* #include */ #define RADIX 10 #define W 110 main() { int a[111],b[111],pi[111]; int i; marctan(a,16,5); marctan(b,4,239); sub(pi,a,b); printf("%d.",pi[0]); for (i=1;i<=100;i++){ if (i%25==1&&i!=1) printf(" "); printf("%d",pi[i]); if (i%5==0) putchar(' '); /* if (i%50==0)*/ /* putchar(' ');*/ if (i%75==0) putchar(' '); if (i%100==0) getchar(); } } marctan(a,n,d) /* a=n*arctan(1/d) */ int a[],n,d; { int e[111],f[111]; int p,i; init(a,0); init(e,n); div(e,e,d,0); p=top(e,0); add(a,a,e); i=3; while(p<=W){ div(e,e,d,p); div(e,e,d,p); div(f,e,i,p); if (i%4==1) add(a,a,f); else sub(a,a,f); p=top(e,p); i+=2; } } div(a,b,n,p) /* a=b/n */ int a[],b[],n,p; { int t,x,i; t=0; for (i=p;i<=W;i++){ x=t*RADIX+b[i]; a[i]=x/n; t=x%n; } } add(a,b,c) /* a=b+c */ int a[],b[],c[]; { int t,x,i; t=0; for (i=W;i>=0;i--){ x=b[i]+c[i]+t; a[i]=x%RADIX; t=x/RADIX; } if (t!=0) printf("overflow\n"); } sub(a,b,c) /* a=b-c */ int a[],b[],c[]; { int t,x,i; t=1; for (i=W;i>=0;i--){ x=b[i]+(RADIX-1-c[i])+t; a[i]=x%RADIX; t=x/RADIX; } if (t!=1) printf("overflow\n"); } top(a,p) int a[],p; { while (p<=W&&a[p]==0) p++; return(p); } init(a,n) int a[],n; { int i; a[0]=n; for (i=1;i<=W;i++) a[i]=0; }