Approximations de Pi: Formule d'Euler

Description

Bonjour,

Leonard Euler (15.4.1707 - 18.9.1783) nous à légué la formule:
Pi/2 =
1 + 1/3 + 2/(3*5) + 2*3/(3*5*7) + 2*3*4/(3*5*7*9) + 2*3*4*5/(3*5*7*9*11) + ...

Elle permet de calculer Pi avec une précision "double" en 50 itérations.

Cet article fait partie de la série CodeS-SourceS: Approximations de Pi.

Voici d'abord deux codes qui calculent explicitement le numérateur num et le dénominateur den des termes à ajouter, dont le seconde est écrit d'une manière plus condensée:
double Euler_A(int n) { // avec numérateur et dénominateur
  double pi=1.0,num=1.0,den=1.0;
  for (int i=1; i<n; ++i) {
    num *= i;
    den *= (2*i+1);
    pi += num/den;
  }
  return 2*pi;
} // Pi/2 = 1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...

double Euler_B(int n) { // plus condensé
  double pi=1.0, num=1.0, den=1.0;
  for (int i=1; i<n; ++i) pi += (num *= i)/(den *= (2*i+1));
  return 2*pi;
} // Pi/2 = 1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...

Nous pouvons remplacer num/den par un seul facteur fac:
double Euler_C(int n) { // avec un seul facteur
  double pi=1.0, fac=1.0;
  for (int i=1, j=1; i<n; ++i) pi += (fac *= (double)i/(j+=2));
  return 2*pi;
} // Pi/2 = 1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...


On rencontre aussi la formule d'Euler sous la forme factorisée:
Pi = 2 + (1/3)*(2 + (2/5)*(2 + (3/7)*(2 + (4/9)*(2 + (5/11)*(2 + ...)))))
Le code correspondant est tout simple:
double Euler_D(int n) { // factorisé
  double pi=0.0;
   for (int i=n-1; i>0; --i) pi = 2.0 + pi*i/(2*i+1);
  return pi;
} // Pi = 2 + (1/3)*(2 + (2/5)*(2 + (3/7)*(2 + (4/9)*(2 + (5/11)*(2 + ...)))))


Le Zip contient le fichier Euler.cpp qui donne l'Output suivant:
Euler_A: pi = 2*{1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...}
  n=  5: pi=3.09841269841270
  n= 10: pi=3.14057816968034
  n= 15: pi=3.14156615934495
  n= 20: pi=3.14159192767515
  n= 25: pi=3.14159263314403
  n= 30: pi=3.14159265300348
  n= 35: pi=3.14159265357277
  n= 40: pi=3.14159265358929
  n= 45: pi=3.14159265358978
  n= 50: pi=3.14159265358979
 precis: pi=3.14159265358979

Euler_B: pi = 2*{1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...}
  n=  5: pi=3.09841269841270
  n= 10: pi=3.14057816968034
  n= 15: pi=3.14156615934495
  n= 20: pi=3.14159192767515
  n= 25: pi=3.14159263314403
  n= 30: pi=3.14159265300348
  n= 35: pi=3.14159265357277
  n= 40: pi=3.14159265358929
  n= 45: pi=3.14159265358978
  n= 50: pi=3.14159265358979
 precis: pi=3.14159265358979

Euler_C: pi = 2*{1 + 1/3 + 2/(3*5) + (2*3)/(3*5*7) + (2*3*4)/(3*5*7*9) + ...}
  n=  5: pi=3.09841269841270
  n= 10: pi=3.14057816968034
  n= 15: pi=3.14156615934495
  n= 20: pi=3.14159192767515
  n= 25: pi=3.14159263314403
  n= 30: pi=3.14159265300348
  n= 35: pi=3.14159265357277
  n= 40: pi=3.14159265358929
  n= 45: pi=3.14159265358978
  n= 50: pi=3.14159265358979
 precis: pi=3.14159265358979

Euler_D: pi = 2 + (1/3)*(2 + (2/5)*(2 + (3/7)*(2 + (4/9)*(2 + ...))))
  n=  5: pi=3.04761904761905
  n= 10: pi=3.13946968064615
  n= 15: pi=3.14153799317348
  n= 20: pi=3.14159116699150
  n= 25: pi=3.14159261190884
  n= 30: pi=3.14159265239821
  n= 35: pi=3.14159265355526
  n= 40: pi=3.14159265358878
  n= 45: pi=3.14159265358976
  n= 50: pi=3.14159265358979
 precis: pi=3.14159265358979


Comme la formule d'Euler est souvent utilisée pour calculer une approximation de pi à la main, j'ai ajouté au Zip les fichiers Excel Euler.xls ou Euler.xlsx qui permettent de voir l'évolution des calculs avec numérateur et dénominateur.
Le fichier EulerExcel.jpg en est un "PrintScreen".
 
 
Bonne lecture ...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.