#include #include #include #include void menu_method(); void menu_sigdig(); double power (int sigdig); double sqroot(double num); double Gauss_Legendre(double digit); double BBP(double digit); double Area(double digit); int main void() { int method, sigdig; //declare variables double pi, digit; while(1) { do{ menu_method(); scanf("%d", &method); fflush(stdin); }while(method<1||method>4)(method!=(int)method)); if (method==4) { printf(Good Bye!!!\n"); exit(1); } do{ //choose significant digits menu_sigdig(); scanf("%d", &sigdig); fflush(stdin); }while (sigdig<0||sigdig>99); digit= power(sigdig); swith(method) { case 1: pi=Gauss_Legendre(digit); break; case 2: pi=BBP(digit); break; case 3: pi= Area(digit); break; } printf("\nthe approximation of pi is << %e >>\n", pi); } return 0; } void menu_method() { double pi=1, temp, diff, a_temp, a=(double)1, b=(double)1/sqroot(2), c, t=(double)1/4, p=(double)1; int flag=0, i=2; pi= ((a+b)*(a+b))/(4*t); printf("\ni=1>> pi = %e\n", pi); do{ a_temp=(a+b)/2; b=sqroot(a*b); t=t-p*(a-a_temp)*(a-a_temp); p=2*p; a=a_temp; temp=((a+b)*(a+b))/(4*t); diff = temp-pi; if(diff < 0) diff = diff*-1; if(diff<=digit) flag = 1; pi=temp; printf("i = %d >> pi = %e\n", i++, pi); }while (flag==0); return pi; } double BBP(double digit) { int i, k=1, flag=0; double a=1.00, b, pi, temp; pi= 4-((double)1/2)-((double)1/5)-((double)1/6); printf("\nk = 0 >> pi = %e\n", pi); do{ for (i=o; i> pi = %e\n", k, pi); k++; }while(flag==0); } double Area(double digit) { double pi=-1, temp, x, y, diff; int r=10, i, area, flag=0; do{ area = 0; for (i=0; i<(2*r+1)*(2*r+1); i++) { x = ((double)rand()/RAND_MAX)*2*r - r; y = ((double)rand()/RAND_MAX)*2*r - r; if(((x*x)+(y*y))<= (r*r)) area++; } temp=(double)area/(r*r); diff = temp-pi; if(diff < 0) diff = diff*-1; if(diff<=digit) flag= 1; pi= temp; printf("r = %d, area = %d, >> pi = %e, diff = %e\n", r, area, pi, diff); r++; }while (flag == 0); return pi;