/* **************************************************************

   Uebungen zur Analysis I fuer Informatiker - WS 2003/04
   Blatt 7

   Freiwillige Zusatzaufgabe 35)
   euler.cpp

   Annaeherung an die Eulersche Zahl e via verschiedener Methoden

   Leonhard Fellermayr, Mat. Nr. 22128130XXXX

   Auch im WWW: http://www.slacky.de/files/uni/analysis/euler.cpp

*************************************************************** */

#include <iostream>

const long double EPSILON_IEEE_64BIT = 1e-16;

long double fak (long double n)
{
	if ((n == 0) ^ (n == 1)) return 1;
	return n * fak (n-1); /* else */
}

long double v1_produktbildung (long double n)
{
	return (pow (1 + (1 / pow (2, n)), pow (2, n)));
}

long double v2_aufsummieren (long double k, long double n)
{
	if (k < n) return ((1 / fak (k)) + v2_aufsummieren (k + 1, n));
	return (1 / fak (n)); /* else */
}

long double v2_klammerung (long double current, long double n)
{
	if (n >= 1)
		return v2_klammerung (current * (1 / n) + 1, n - 1);
	return current; /* else */
}

int main ()
{

	int n = 0;

	printf (" n | v1_produktbildung | v2_aufsummieren   | v2_klammerung\n");
	printf ("--------------------------------------------------------------\n");

	while (not ((1 / fak (n+1)) < EPSILON_IEEE_64BIT))

		printf ("%2d | %.15Lf | %.15Lf | %.15Lf\n",
			++n, v1_produktbildung (n),
			v2_aufsummieren (0, n), v2_klammerung (1, n));

	return 0;
}
