Bonjour,
Bill Gosper (Ralph William Gosper), mathématicien et informaticien américain est né en 1943.
En ce qui concerne Pi, on lui doit principalement la formule:
Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
et la série:
Pi = 3 + 1/4/5/3*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))
Vous trouverez de la documentation dans:
Wiki:
Bill Gosper,
Bill Gosper (en)
pi314:
William Gosper
Cet article fait partie de la série
CodeS-SourceS: Approximations de Pi <---
cliquez !.
Pour "vérifier" la formule, donnons d'abord un code qui emploie des factorielles précalculées:
// Formule de Gosper: Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
double Gosper_A(int n) { // calcul avec les factorielles
double s = 0;
for (int i=0; i<n; ++i) s += fact[i]*fact[i]/fact[2*i+1];
return sqrt(6.75)*s;
}
La programmation reste très simple lorsqu'on n'utilise pas explicitement les factorielles:
// Formule de Gosper transformée en série:
// Pi = sqrt(6.75)*[1 + 1/6 + 2/10 + 3/14 + 4/18 + ...)]
double Gosper_B(int n) { // calcul sans les factorielles
double s = 1, t = 1;
for (int i=1; i<n; ++i) {
t *= (double)i/(4*i + 2);
s += t;
}
return sqrt(6.75)*s;
}
Il faut 23 itérations pour atteindre la précision
double.
Avec la série de Gosper, 12 itérations suffisent:
// Série de Gosper: Pi =
// 3 + 1/4/5/3*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))
double Gosper_C(int n) {
double s = 5*(n+1) - 2;
for (int i=n; i>0; --i) s = 5*i - 2 + s*i*(2*i - 1)/(3*i + 1)/(3*i + 2)/3;
return s;
}
Le
Zip contient le fichier
Gosper.cpp qui donne l'
Output suivant:
Gosper_A: Pi = sqrt(6.75)*Somme(i>=0) [i! * i! / (2*i+1)!]
n= 1: pi=2.59807621135332
n= 2: pi=3.03108891324554
n= 3: pi=3.11769145362398
n= 4: pi=3.13624914084793
n= 5: pi=3.14037307134214
n= 6: pi=3.14131032827265
n= 7: pi=3.14152661833353
n= 8: pi=3.14157708601440
n= 9: pi=3.14158896076284
n= 10: pi=3.14159177320327
n= 11: pi=3.14159244283194
n= 12: pi=3.14159260296053
n= 13: pi=3.14159264139140
n= 14: pi=3.14159265064327
n= 15: pi=3.14159265287648
n= 16: pi=3.14159265341677
n= 17: pi=3.14159265354775
n= 18: pi=3.14159265357956
n= 19: pi=3.14159265358730
n= 20: pi=3.14159265358919
n= 21: pi=3.14159265358964
n= 22: pi=3.14159265358976
n= 23: pi=3.14159265358979
precis: pi=3.14159265358979
Gosper_B: Pi = sqrt(6.75)*[1 + 1/6 + 2/10 + 3/14 + 4/18 + ...)]
n= 1: pi=2.59807621135332
n= 2: pi=3.03108891324554
n= 3: pi=3.11769145362398
n= 4: pi=3.13624914084793
n= 5: pi=3.14037307134214
n= 6: pi=3.14131032827265
n= 7: pi=3.14152661833353
n= 8: pi=3.14157708601440
n= 9: pi=3.14158896076284
n= 10: pi=3.14159177320327
n= 11: pi=3.14159244283194
n= 12: pi=3.14159260296053
n= 13: pi=3.14159264139140
n= 14: pi=3.14159265064327
n= 15: pi=3.14159265287648
n= 16: pi=3.14159265341677
n= 17: pi=3.14159265354775
n= 18: pi=3.14159265357956
n= 19: pi=3.14159265358730
n= 20: pi=3.14159265358919
n= 21: pi=3.14159265358964
n= 22: pi=3.14159265358976
n= 23: pi=3.14159265358979
precis: pi=3.14159265358979
Gosper_C:
pi = 3 + 1/60*(8 + 2*3/7/8/3*(13 + 3*5/10/11/3*(18 + 4*7/13/14/3*(23 + ...))))
n= 1: pi=3.13333333333333
n= 2: pi=3.14107142857143
n= 3: pi=3.14155844155844
n= 4: pi=3.14159035409035
n= 5: pi=3.14159249655573
n= 6: pi=3.14159264274275
n= 7: pi=3.14159265283407
n= 8: pi=3.14159265353679
n= 9: pi=3.14159265358606
n= 10: pi=3.14159265358953
n= 11: pi=3.14159265358977
n= 12: pi=3.14159265358979
precis: pi=3.14159265358979
Bonne lecture ...
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.