Approximations de Pi: Formule de Chudnovsky

Description

Bonjour,

Voici une formule découverte par les frères David et Grégory Chudnovsky en 1987:

426880*sqrt(10005)/pi =
  (6*i)! * (13591409+545140134*i) / (3*i)! / i!^3 / -640320^(3*i)

A chaque itération, elle permet d'ajouter 14 décimales correctes à l'approximation de Pi.

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

Comme dans tous les articles de cette série, on se limite à la précision double, utilisons les deux lignes de code:
double fact[171]={1}; // pour couvrir tout le domaine "double"

for (int i=1; i<=170; ++i) fact[i]=i*fact[i-1];
pour calculer à l'avance toutes les factorielles de ce domaine.
Il faudra se veiller à ne pas dépasser 170!, ce qui est largement le cas ici.

Le code ressemble assez à celui de la formule de Ramanujan:
double Chudnovsky_A(int n) {
  double s=0;
  for (int i=0; i<n; ++i) s += fact[6*i] * (13591409.0+545140134.0*i)
    / fact[3*i] / pow(fact[i],3) / pow(-640320.0,3*i);
  return 426880.0*sqrt(10005.0)/s;
}
On trouve Pi avec une précision double après 1 ou 2 itérations seulement !

Comme le montre Nick Craig-Wood, on peut éviter d'utiliser explicitement les factorielles:
double Chudnovsky_B(int n) {
  double a=1, sa=1, sb=0;
  for (int i=1; i<n; ++i) {
    a *= (1-2*i)*(1-6*i)*(5-6*i);
    sa += (a /= 10939058860032000.0*i*i*i);
    sb += a*i;
  }
  return 426880.0*sqrt(10005.0)/(13591409.0*sa + 545140134.0*sb);
}


Le Zip contient le seul fichier source Chudnovsky.cpp dont voici l'Output:
426880*sqrt(10005) / pi =
(6*i)! * (13591409+545140134*i) / (3*i)! / i!^3 / -640320^(3*i):

Chudnovsky_A:
  n= 1: pi=3.14159265358973
  n= 2: pi=3.14159265358979
  n= 3: pi=3.14159265358979
précis: pi=3.14159265358979

Chudnovsky_B:
  n= 1: pi=3.14159265358973
  n= 2: pi=3.14159265358979
  n= 3: pi=3.14159265358979
précis: pi=3.14159265358979


pi314: L'univers de Pi: Grégory et David Chudnovsky
Nick Craig-Wood: Pi - Chudnovsky
 
 
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.