CALCUL DE PI AVEC PRÉCISION DÉTERMINABLE

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 20 janv. 2006 à 18:41
lynxtyle Messages postés 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 - 20 janv. 2008 à 09:19
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35670-calcul-de-pi-avec-precision-determinable

lynxtyle Messages postés 79 Date d'inscription samedi 25 septembre 2004 Statut Membre Dernière intervention 31 octobre 2011 2
20 janv. 2008 à 09:19
L'auteur du code est Dik T. Winter (cwi institute, Holland)...

sinon Sebastian Wedeniws à fait celui-ci de 142 charactères (donc 16 de moi que le précédant) :
main(){int a=1e4,c=3e3,b=c,d=0,e=0,f[3000],g=1,h=0;
for(;b;!--b?printf("%04d",e+d/a),e=d%a,h=b=c-=15:f[b]=
(d=d/g*b+a*(h?f[b]:2e3))%(g=b*2-1));}

et le plus court code de calcul de pi dont je connais l'existance est celui de Gjerrit Meinsma à 141 charactères pour une précision de 1000 :
long k=4e3,p,a[337],q,t=1e3;
main(j){for(;a[j=q=0]+=2,--k;)
for(p=1+2*k;j<337;q=a[j]*k+q%p*t,a[j++]=q/p)
k!=j>2?:printf("%.3d",a[j-2]%t+q/p/t);}
Johqn Messages postés 3 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 7 février 2006
7 févr. 2006 à 20:40
Je n'ai pas réussi à trouver l'auteur de ce programme.

En revanche voici un lien vers le site de celui qui a réussi à comprendre son fonctionnement : http://macforever.free.fr/div/pi.html
transfear Messages postés 58 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 29 septembre 2006
7 févr. 2006 à 19:41
Ah ah ah! Très fort, vraiment... je m'avoue battu à plat de couture!

Qui en est l'auteur?
Johqn Messages postés 3 Date d'inscription dimanche 7 novembre 2004 Statut Membre Dernière intervention 7 février 2006
7 févr. 2006 à 18:26
Voici un programme qui affiche les 2400 premiers chiffres qui composent Pi :

#include <stdio.h>

int main(void)
{
int a 10000, b 0, c = 8400, d, e, f[8401], g;

for (; b-c ;) f[b++] = a/5;

for (; d=0, g=c*2 ; c-=14, printf("%.4d",e+d/a), e=d%a)

for (b=c ; d+=f[b]*a, f[b]=d%--g, d/=g--, --b ; d*=b);

system("PAUSE");
}

L'algorithme utilisé repose sur une série d'Euler :

Pi 2 (1 + 1/3 + 1.2 / 3.5 + 1.2.3 / 3.5.7 + 1.2.3.4 / 3.5.7.9 + ...)
2 somme pour_n=0_à_l'infini de (1.2. ... .n / 1.3. ... (2.n+1))

Avec cette série, on montre que pour connaître Pi avec une précision de N décimales il suffit de sommer
Log2(10N) ~= 3,32.N termes.

Les calculs étant effectués en base 10 000, les chiffres sont affichés par groupe de 4 à la fin du calcul.

Le programme calcule 600 chiffres en base 10 000 équivalant à 2 400 chiffres décimaux.

Le nombre de termes utilisés est 600.4.3,32 ~= 8 400 (arrondi).

Le programme comporte une première boucle d'initialisation, suivie d'une double boucle de calcul et d'impression.

La double boucle exploite la série d'Euler écrite sous la forme de Horner pour limiter le nombre de multiplications :

1 000 Pi ~= 10 000 / 5 ( 1 + 1 / 3 ( 1 + 2 / 5 ( 1 + 3 / 7 ( ... + 8 399 / 16 799 ))))

Pour aboutir, le calcul doit être effectué dès le départ avec un nombre de chiffres de l'ordre de grandeur de celui voulu à la fin.
transfear Messages postés 58 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 29 septembre 2006
1 févr. 2006 à 00:57
Je pourrais essayer de modifier l'algorithme de manière à réserver une plus grande plage mémoire pour le calcul de la valeur de Pi, en utilisant plusieurs variables de type double juxtaposées, afin d'augmenter la précision.

En tout cas, c'est une piste pour qui désire améliorer ce code.
djmoa Messages postés 39 Date d'inscription mercredi 6 octobre 2004 Statut Membre Dernière intervention 27 mai 2009
31 janv. 2006 à 21:42
JE partage l'avis de MetalDwarf. Pour information, un double est sur 8 octets (c'est ton premier code, t'as pas du encore voir l'utilité), c'est en quelque sorte la precision de tes nombres. Quand tu fais tes premières divisions, l'erreur est très faible par rapport aux nombres que tu trouves, mais au fur et a mesure que tes divisions donnent un résultat petit (1/500001 par exemple) plus l'ereur relative sera importante, et il y a un moment ou tes calculs ne voudrons plus rien dire car tu n'augmentera plus la precision du ton nombre PI.
c'est pourquoi il faut aborder le problème d'une autre manière, mais je sais pas comment.
Contente toi de ce programme pour l'instant, c'est sympa comme premier programme, puis repenche toi sur la question quand tu aura plus d'expérience du C.
Bon courage
le_duche Messages postés 159 Date d'inscription lundi 13 juin 2005 Statut Membre Dernière intervention 26 février 2009
26 janv. 2006 à 18:34
effectivement, avec 5000 tu t'en approche très fortement...
CyberP Messages postés 283 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 4 juillet 2007 2
24 janv. 2006 à 19:29
merci
c'est ce que je voulais dire par "on aura la vraie valeur de pi ?" (je ne pensais pas "la valeur exacte" mais une valeur très précise)
cs_krust Messages postés 140 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 19 novembre 2006
23 janv. 2006 à 19:27
C'est un developpement en série, donc plus on calcul de termes plus l'approximations se précise.
Théoriquement, si on calcul une infinité de ceux-ci l'aproximation devrait être égale à la valeur réelle de pi.
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
23 janv. 2006 à 17:46
Sinon il faut aussi sgnaler qu'en plus d'être lente, cette méthode ne donnera jamais une approximation meilleure que 10-12 décimales au mieux, du fait de l'imprécision des calculs faits par les ordinateurs avec des double. Pour pallier ce problème, il faut faire les opérations "à la main", comme expliqué sur la page de l'ENSTB citée plus haut.
CyberP Messages postés 283 Date d'inscription mercredi 8 janvier 2003 Statut Membre Dernière intervention 4 juillet 2007 2
23 janv. 2006 à 17:33
"Pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... à l'infini"
ça dure vraiment jusqu'à l'infini ?
c'est à dire que si on met 5000 par exemple, on aura la vraie valeur de pi ?
(c'est juste pour savoir, ce n'est en rien une critique)
cs_krust Messages postés 140 Date d'inscription mercredi 3 juillet 2002 Statut Membre Dernière intervention 19 novembre 2006
21 janv. 2006 à 22:07
Aussi non, y a le site sur pi : http://www.nombrepi.com/
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
21 janv. 2006 à 12:33
Ton code m'a donné envie de chercher plus loin comment calculer une approximation de pi, j'ai trouvé une page bien sympa : http://perso-info.enst-bretagne.fr/~brouty/Maths/PI/pialgo.html
Merci à toi =)
carcarias Messages postés 1 Date d'inscription mardi 10 janvier 2006 Statut Membre Dernière intervention 20 janvier 2006
20 janv. 2006 à 23:13
bof ...tu pe bluffer tt le monde en affichant la valeur 22/7 !
plus sérieusement et si tu comptes utiliser une somme infinie pr calculer pi, y'a aussi pleins d'autre approximations, (transfear a utilisé une approximation de pi/4) ,je te renvoie a ce site en anglais avec des dizaines d'approximations qui peuvent atteindre 30 chiffre aprés la virgule, le plus dur est de taper la formuule :-) .
Allez, include<math.h> et c parti !
http://mathworld.wolfram.com/PiApproximations.html
cs_algori Messages postés 868 Date d'inscription dimanche 26 décembre 2004 Statut Membre Dernière intervention 26 février 2008 1
20 janv. 2006 à 20:50
Quelqu'un sait quel est actuellement l'algo le plus repide pour le calcul de pi ?
Ca m'intéresse.
transfear Messages postés 58 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 29 septembre 2006
20 janv. 2006 à 18:48
Effectivement. Et je ne suis pas encore assez habile avec le langage C pour programmer une autre méthode de calcul moi-même.

De plus, tel que je l'ai écrit dans les commentaires finaux, le but de ce code n'est pas la vitesse de calcul.

Merci tout de même pour ce commentaire.

P-S: Je DÉBUTE en C/C++. Merci d'être indulgent.
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
20 janv. 2006 à 18:41
Tu n'a pas dû chercher très loin, c'est une des méthodes les plus lentes qu'on puisse trouver (a moins de faire exprès de trouver plus lent)
Rejoignez-nous