#include <iostream>
#include <iomanip>
#include <math.h>
#include <sys/time.h>
using namespace std;
/* Johann Heinrich Lambert */
long double pi1()
{
unsigned long i = 25;
long double r = i * 2;
for(; i > 0 ; --i)
r = (i * 2 - 1) + i * i / r;
return(4.0 / r);
}
/* Leibniz */
long double pi2()
{
long double r = 4.0;
for(unsigned long i = 3 ; i < 350000000 ; i += 4)
r += 4.0 / (long double) (i + 2) - 4.0 / (long double) i;
return(r);
}
/* John Wallis */
long double pi3()
{
long double r = 2.0;
unsigned long a = 1, b = 2;
for(; b < 30000000 ; b += 2, a += 2)
r *= (b / (long double) a) * (b / ((long double) a + 2));
return(r);
}
/* Bailey-Borwein-Plouffe */
long double pi4()
{
long double r = 0;
for(unsigned long i = 0 ; i <= 13 ; ++i)
r += 1 / powl(16, i) * (4 / (8 * (long double) i + 1) - 2 / (8 * (long double) i + 4) - 1 / (8 * (long double) i + 5) - 1 / (8 * (long double) i + 6));
return(r);
}
/* Archimedes */
long double pi5()
{
long double r = 2 * sqrtl(3), b = 3;
while (r != b) {
r = 2 * r * b / (r + b);
b = sqrtl(r * b);
}
return(r);
}
int main()
{
struct timeval a, b;
long long t;
cout << "pi = 3.1415926535897932384626433832795028841971693993751058209749" << endl;
gettimeofday(&b, 0);
cout << "Lambert ~ " << setw(26) << setprecision(25) << pi1() << " ";
gettimeofday(&a, 0);
t = (a.tv_sec - b.tv_sec) * 1000000 + a.tv_usec - b.tv_usec;
cout << t << " ?s" << endl;
gettimeofday(&b, 0);
cout << "Archimedes ~ " << setw(26) << setprecision(25) << pi5() << " ";
gettimeofday(&a, 0);
t = (a.tv_sec - b.tv_sec) * 1000000 + a.tv_usec - b.tv_usec;
cout << t << " ?s" << endl;
gettimeofday(&b, 0);
cout << "BBP ~ " << setw(26) << setprecision(25) << pi4() << " ";
gettimeofday(&a, 0);
t = (a.tv_sec - b.tv_sec) * 1000000 + a.tv_usec - b.tv_usec;
cout << t << " ?s" << endl;
gettimeofday(&b, 0);
cout << "Leibniz ~ " << setw(26) << setprecision(25) << pi2() << " ";
gettimeofday(&a, 0);
t = (a.tv_sec - b.tv_sec) * 1000000 + a.tv_usec - b.tv_usec;
cout << t << " ?s" << endl;
gettimeofday(&b, 0);
cout << "Wallis ~ " << setw(26) << setprecision(25) << pi3() << " ";
gettimeofday(&a, 0);
t = (a.tv_sec - b.tv_sec) * 1000000 + a.tv_usec - b.tv_usec;
cout << t << " ?s" << endl;
return(0);
}