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
12
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)