lynxtyle
Messages postés79Date d'inscriptionsamedi 25 septembre 2004StatutMembreDernière intervention31 octobre 20112 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és3Date d'inscriptiondimanche 7 novembre 2004StatutMembreDernière intervention 7 février 2006 7 févr. 2006 à 20:40
Je n'ai pas réussi à trouver l'auteur de ce programme.
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és58Date d'inscriptionlundi 13 octobre 2003StatutMembreDernière intervention29 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és39Date d'inscriptionmercredi 6 octobre 2004StatutMembreDernière intervention27 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és159Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention26 février 2009 26 janv. 2006 à 18:34
effectivement, avec 5000 tu t'en approche très fortement...
CyberP
Messages postés283Date d'inscriptionmercredi 8 janvier 2003StatutMembreDernière intervention 4 juillet 20072 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és140Date d'inscriptionmercredi 3 juillet 2002StatutMembreDernière intervention19 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és241Date d'inscriptionmardi 29 octobre 2002StatutMembreDernière intervention23 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és283Date d'inscriptionmercredi 8 janvier 2003StatutMembreDernière intervention 4 juillet 20072 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és140Date d'inscriptionmercredi 3 juillet 2002StatutMembreDernière intervention19 novembre 2006 21 janv. 2006 à 22:07
carcarias
Messages postés1Date d'inscriptionmardi 10 janvier 2006StatutMembreDernière intervention20 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és868Date d'inscriptiondimanche 26 décembre 2004StatutMembreDernière intervention26 février 20081 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és58Date d'inscriptionlundi 13 octobre 2003StatutMembreDernière intervention29 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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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)
20 janv. 2008 à 09:19
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);}
7 févr. 2006 à 20:40
En revanche voici un lien vers le site de celui qui a réussi à comprendre son fonctionnement : http://macforever.free.fr/div/pi.html
7 févr. 2006 à 19:41
Qui en est l'auteur?
7 févr. 2006 à 18:26
#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.
1 févr. 2006 à 00:57
En tout cas, c'est une piste pour qui désire améliorer ce code.
31 janv. 2006 à 21:42
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
26 janv. 2006 à 18:34
24 janv. 2006 à 19:29
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)
23 janv. 2006 à 19:27
Théoriquement, si on calcul une infinité de ceux-ci l'aproximation devrait être égale à la valeur réelle de pi.
23 janv. 2006 à 17:46
23 janv. 2006 à 17:33
ç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)
21 janv. 2006 à 22:07
21 janv. 2006 à 12:33
Merci à toi =)
20 janv. 2006 à 23:13
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
20 janv. 2006 à 20:50
Ca m'intéresse.
20 janv. 2006 à 18:48
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.
20 janv. 2006 à 18:41