using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConstanteNeperDos

{

    class Program

    {

        /// <summary>

        /// Fonction par algorithme récursif de factoriel

        /// </summary>

        /// <param name="n">Nombre dont on veux la factoriel</param>

        /// <returns>renvoie le résultat</returns>

        public static double factoriel(double n)

        {

            if (n <= 1) return 1;

            else

            {

                return n *= factoriel(n - 1);

            }

        }

 

 

        /// <summary>

        /// Calcul d'un nombre exposant d'un nombre réel (pour l'utilisation d'un algo de calcul de la constante de Neper)

        /// </summary>

        /// <param name="n">Choix du nombre</param>

        /// <param name="exp">Choix de l'exposant en nombre réel (Strictement positif)</param>

        /// <returns>retourne le résultat</returns>

        public static double exposant(double n, double exp)

        {

            int i = 0;

            double resultat = n;

            while (i < exp)

            {

                resultat *= n;

                i++;

            }

            return resultat / n;

        }

 

 

        /// <summary>

        /// Fonction calculant la constante de Neper

        /// </summary>

        /// <param name="precision">Nombre de boucles pour la précision</param>

        /// <returns>renvoie le résultat</returns>

        public static double neperFacto(double precision)

        {

            double n = 1;

            double resultat = 1;

            while (n < precision)

            {

                resultat += 1 / factoriel(n);

                n++;

            }

            return resultat;

        }

 

 

        /// <summary>

        /// Fonction moins précise et plus lente pour obtenir une partie de e

        /// </summary>

        /// <param name="precision">Niveau de précision souhaité</param>

        /// <returns>renvoie le résultat</returns>

        public static double neperPeuPrecis(double precision)

        {

            return exposant(1 + 1 / precision, precision);

        }

 

        static void Main(string[] args)

        {

            Console.ForegroundColor = ConsoleColor.Green;

            Console.WriteLine("Constante de Neper avec un développement de E en série");

            Console.ForegroundColor = ConsoleColor.Cyan;

            Console.WriteLine(neperFacto(20));

            Console.ForegroundColor = ConsoleColor.Green;

            Console.WriteLine("Constante de Neper avec Math.E");

            Console.ForegroundColor = ConsoleColor.Yellow;

            Console.WriteLine(Math.E);

            Console.ForegroundColor = ConsoleColor.Green;

            Console.WriteLine("Constante de Neper par une fonction lente et peu efficace");

            Console.ForegroundColor = ConsoleColor.Magenta;

            Console.WriteLine(neperPeuPrecis(100000000).ToString(".########"));

            Console.ReadKey();

        }

    }

}