PI: 3.1415926535...

Calculate Pi by Averaging
Using an Explicit Formula
for N = 32, A = 16, T = 15


Calculate Pi by Averaging, Using an Explicit Formula: Here are two simple formulas, based on averaging, that calculate Pi:

This page shows the specific case of these formulas for N = 32, T = 15, and A = 16.

Calculate array values Final calculations
int main() {
   double s[33], sum;
   int b;
   s[0]  = 1;
   s[1]  = s[0]  - 1./3;
   s[2]  = s[1]  + 1./5;
   s[3]  = s[2]  - 1./7;
   s[4]  = s[3]  + 1./9;
   s[5]  = s[4]  - 1./11;
   s[6]  = s[5]  + 1./13;
   s[7]  = s[6]  - 1./15;
   s[8]  = s[7]  + 1./17;
   s[9]  = s[8]  - 1./19;
   s[10] = s[9]  + 1./21;
   s[11] = s[10] - 1./23;
   s[12] = s[11] + 1./25;
   s[13] = s[12] - 1./27;
   s[14] = s[13] + 1./29;
   s[15] = s[14] - 1./31;
   s[16] = s[15] + 1./33;
   s[17] = s[16] - 1./35;
   s[18] = s[17] + 1./37;
   s[19] = s[18] - 1./39;
   s[20] = s[19] + 1./41;
   s[21] = s[20] - 1./43;
   s[22] = s[21] + 1./45;
   s[23] = s[22] - 1./47;
   s[24] = s[23] + 1./49;
   s[25] = s[24] - 1./51;
   s[26] = s[25] + 1./53;
   s[27] = s[26] - 1./55;
   s[28] = s[27] + 1./57;
   s[29] = s[28] - 1./59;
   s[30] = s[29] + 1./61;
   s[31] = s[30] - 1./63;
   b = 1;         sum  =   s[15];
   b = b*16;      sum += b*s[16];
   b = b*15 / 2;  sum += b*s[17];
   b = b*14 / 3;  sum += b*s[18];
   b = b*13 / 4;  sum += b*s[19];
   b = b*12 / 5;  sum += b*s[20];
   b = b*11 / 6;  sum += b*s[21];
   b = b*10 / 7;  sum += b*s[22];
   b = b* 9 / 8;  sum += b*s[23];
   b = b* 8 / 9;  sum += b*s[24];
   b = b* 7 /10;  sum += b*s[25];
   b = b* 6 /11;  sum += b*s[26];
   b = b* 5 /12;  sum += b*s[27];
   b = b* 4 /13;  sum += b*s[28];
   b = b* 3 /14;  sum += b*s[29];
   b = b* 2 /15;  sum += b*s[30];
                  sum +=   s[31];
   sum /= 16384;

   printf("%20.17f\n", sum);
}
% ./ave2 3.14159265358979267

In the above, there are 94 operations on doubles, and 29 integer operations, the latter used only to calculate the binomial coefficients.

The program on the left below uses precalculated binomial coefficients, eliminates the array, and simplifies in other ways. Now there are still 94 operations on doubles and no integer operations. The program on the right below includes the integer computation of the binomial coefficients.

Formulas simplified Calculate Binomial Coef.
int main() {
   double sum, s;

   sum = s =   
       1.    - 1./3  + 
       1./5  - 1./7  +
       1./9  - 1./11 +
       1./13 - 1./15 +
       1./17 - 1./19 +
       1./21 - 1./23 +
       1./25 - 1./27 +
       1./29 - 1./31;
   sum +=
     (s += 1./33)*16 +
     (s -= 1./35)*120 +
     (s += 1./37)*560 +
     (s -= 1./39)*1820 +
     (s += 1./41)*4368 +
     (s -= 1./43)*8008 +
     (s += 1./45)*11440 +
     (s -= 1./47)*12870 +
     (s += 1./49)*11440 +
     (s -= 1./51)*8008 +
     (s += 1./53)*4368 +
     (s -= 1./55)*1820 +
     (s += 1./57)*560 +
     (s -= 1./59)*120 +
     (s += 1./61)*16 +
     (s -= 1./63);
   sum /= 16384;
   printf("%20.17f\n",sum);
}
% ./ave2 3.14159265358979312
int main() {
   double sum, s;
   int b = 1;
   sum = s =   
       1.    - 1./3  + 
       1./5  - 1./7  +
       1./9  - 1./11 +
       1./13 - 1./15 +
       1./17 - 1./19 +
       1./21 - 1./23 +
       1./25 - 1./27 +
       1./29 - 1./31;
   sum += 
     (s += 1./33)*(b = b*16)    +
     (s -= 1./35)*(b = b*15/ 2) +
     (s += 1./37)*(b = b*14/ 3) +
     (s -= 1./39)*(b = b*13/ 4) +
     (s += 1./41)*(b = b*12/ 5) +
     (s -= 1./43)*(b = b*11/ 6) +
     (s += 1./45)*(b = b*10/ 7) +
     (s -= 1./47)*(b = b* 9/ 8) +
     (s += 1./49)*(b = b* 8/ 9) +
     (s -= 1./51)*(b = b* 7/10) +
     (s += 1./53)*(b = b* 6/11) +
     (s -= 1./55)*(b = b* 5/12) +
     (s += 1./57)*(b = b* 4/13) +
     (s -= 1./59)*(b = b* 3/14) +
     (s += 1./61)*(b = b* 2/15) +
     (s -= 1./63);
   sum /= 16384;
   printf("%20.17f\n", sum);
}
% ./ave2 3.14159265358979312

The program below uses a separate function to calculate the binomial coefficients. This function is almost as inefficient as such a function can be.

Inefficient Binomial Coefficients
int main() {
   double sum, s;
   sum = s =
       1.    -
       1./3  +
       1./5  -
       1./7  +
       1./9  -
       1./11 +
       1./13 -
       1./15 +
       1./17 -
       1./19 +
       1./21 -
       1./23 +
       1./25 -
       1./27 +
       1./29 -
       1./31;
   sum +=
     (s += 1./33)*c(16,1) +
     (s -= 1./35)*c(16,2) +
     (s += 1./37)*c(16,3) +
     (s -= 1./39)*c(16,4) +
     (s += 1./41)*c(16,5) +
     (s -= 1./43)*c(16,6) +
     (s += 1./45)*c(16,7) +
     (s -= 1./47)*c(16,8) +
     (s += 1./49)*c(16,7) +
     (s -= 1./51)*c(16,6) +
     (s += 1./53)*c(16,5) +
     (s -= 1./55)*c(16,4) +
     (s += 1./57)*c(16,3) +
     (s -= 1./59)*c(16,2) +
     (s += 1./61)*c(16,1) +
     (s -= 1./63);
   sum /= 16384;
   printf("%20.17f\n",sum);
}
// terribly inefficient!
int c(int r, int k) {
   if (k == 0 || k == r) return 1;
   return c(r-1, k) + c(r-1, k-1);
}
% ./ave2
 3.14159265358979312