Calcul de PI

Calcul de PI - Programmation

Marsh Posté le 17-11-2001 à 00:48:15    

Voilà, au lycée, on nous a proposé de faire un concours Einstein, sur le nombre PI.
Et on charche comment le calculer. Donc, g pensé le faire en Delphi car c sous windows (koi que pas indispensable), c gratos, c ce que je connais le plus.
Mais voilà, les nombre ont une précision X, il faudrait que je trouve les nombres avec une précision bcp plus grande : + de 100 décimales minimum. Je pensais donc remplir un tableau avec dans chaque cellule le nombre mais le problème est que g aucune formule pouvant faire ça. Qqn en a t il une ?
Qqn a déjà fait des algo sur PI ?
Merci de me renseigner.

Reply

Marsh Posté le 17-11-2001 à 00:48:15   

Reply

Marsh Posté le 17-11-2001 à 01:09:10    

attend, je calcule ...
ca fait dans les :
3.14159 26535 89793 23846 26433 83279 50288 41971 69399 37510 58209 74944 59230 78164 06286 20899 86280 34825 34211 70679 82148 08651 32823 06647 09384 46095 50582 23172 53594 08128 48111 74502 84102 70193 85211 05559 64462 29489 54930 38196 44288 10975 66593 34461 28475 64823 37867 83165 27120 19091 45648 56692 34603 48610 45432 66482 13393 60726 02491 41273 72458 70066 06315 58817 48815 20920 96282 92540 91715 36436 78925 90360 01133 05305 48820 46652 13841 46951 94151 16094 33057 27036 57595 91953 09218 61173 81932 61179 31051 18548 07446 23799 62749 56735 18857 52724 89122 79381 83011 94912 98336 73362 44065 66430 86021 39494 63952 24737 19070 21798 60943 70277 05392 17176 29317 67523 84674 81846 76694 05132 00056 81271 45263 56082 77857 71342 75778 96091 73637 17872 14684 40901 22495 34301 46549 58537 10507 92279 68925 89235 42019 95611 21290 21960 86403 44181 59813 62977 47713 09960 51870 72113 49999 99837 29780 49951 05973 17328 16096 31859 50244 59455 34690 83026 42522 30825 33446 85035 26193 11881 71010 00313 78387 52886 58753 32083 81420 61717 76691 47303 59825 34904 28755 46873 11595 62863 88235 37875 93751 95778 18577 8044


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2001 à 01:18:27    

;)
y'a enormement de sites sur ca
http://www.peripheria.net/calcul/
http://trucsmaths.free.fr/Pi.htm
http://www.nombrepi.com/
...
mais celui-ci devrait te convenir
c'est du pascal (faudra qq modif pour delphi mais ca devrait aller ;))
http://www.chez.com/algor/math/pi.htm
 
au fait, pkoi dis tu que Delphi est gratos ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-11-2001 à 01:45:37    

Pour un algo performant, tu peux lire l'aide de super_pi par exemple...
 
www.reglisse.fr.st

Reply

Marsh Posté le 17-11-2001 à 02:03:42    

http://www.google.com/search?hl=fr [...] rithme&lr=
 
Google rulez...


---------------
Vendredi c'est Buitoni
Reply

Marsh Posté le 17-11-2001 à 09:31:15    

J'ai trouve ça:
 
 
Je suis un jour tombé sur un petit programme de 10 lignes, écrit en langage C dans un style pour le moins concis (les développeurs apprécieront), et ayant l'étonnante propriété de calculer les 2 400 premières décimales de Pi (2 399 pour être tout à fait exact, si l'on considère que le premier chiffre 3 représente la partie entière).
 
L'auteur en est inconnu et le principe appliqué m'échappe totalement.
 
Voici le petit bijou :
 
#include <stdio.h>  
void main(void)
{
int a = 10000, b, 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);  
  }
}
 
 
Pour les non coutumiers du langage C, en voici une traduction en pseudo-langage :
 
programme  
variables :
  a,b,c,d,e,g : entiers
  f : tableau_de 8401 entiers (de f[0] à f[8400])
 
a = 10000  
b = 0  
c = 8400
 
tant_que (b différent_de c) faire
  f[b] = a / 5
  b = b+1
fin_faire
 
tant_que (c > 0) faire
  d = 0
  g = 2*c
  b = c
  tant_que (b > 0) faire
    d = d + f[b]*a
    g = g-1
    f[b] = d modulo g
    d = d / g
    g = g-1
    b = b-1
    d = d*b
  fin_faire
  c = c-14
  Imprimer_au_minimum_sur_4_caractères (e+d/a)
  e = d modulo a
fin_faire
 
fin_programme
 
 
et si vous n'avez pas de compilateur à portée de la main, en voici le résultat :
 
314159265358979323846264338327950288419716939937510582097494 459230781640628620899862803482534211706798214808651328230664 709384460955058223172535940812848111745028410270193852110555 964462294895493038196442881097566593344612847564823378678316 527120190914564856692346034861045432664821339360726024914127 372458700660631558817488152092096282925409171536436789259036 001133053054882046652138414695194151160943305727036575959195 309218611738193261179310511854807446237996274956735188575272 489122793818301194912983367336244065664308602139494639522473 719070217986094370277053921717629317675238467481846766940513 200056812714526356082778577134275778960917363717872146844090 122495343014654958537105079227968925892354201995611212902196 086403441815981362977477130996051870721134999999837297804995 105973173281609631859502445945534690830264252230825334468503 526193118817101000313783875288658753320838142061717766914730 359825349042875546873115956286388235378759375195778185778053 217122680661300192787661119590921642019893809525720106548586 327886593615338182796823030195203530185296899577362259941389 124972177528347913151557485724245415069595082953311686172785 588907509838175463746493931925506040092770167113900984882401 285836160356370766010471018194295559619894676783744944825537 977472684710404753464620804668425906949129331367702898915210 475216205696602405803815019351125338243003558764024749647326 391419927260426992279678235478163600934172164121992458631503 028618297455570674983850549458858692699569092721079750930295 532116534498720275596023648066549911988183479775356636980742 654252786255181841757467289097777279380008164706001614524919 217321721477235014144197356854816136115735255213347574184946 843852332390739414333454776241686251898356948556209921922218 427255025425688767179049460165346680498862723279178608578438 382796797668145410095388378636095068006422512520511739298489 608412848862694560424196528502221066118630674427862203919494 504712371378696095636437191728746776465757396241389086583264 599581339047802759009946576407895126946839835259570982582262 052248940772671947826848260147699090264013639443745530506820 349625245174939965143142980919065925093722169646151570985838 741059788595977297549893016175392846813826868386894277415599 185592524595395943104997252468084598727364469584865383673622 262609912460805124388439045124413654976278079771569143599770 012961608944169486855584840635342207222582848864815845602850  
 
Questions
Lors de la mise en ligne de cette page j'avais posé les questions suivantes :
 
Quelqu'un serait il capable de m'expliquer l'algorithme sur lequel reposent ces quelques lignes de code ?  
Pourquoi 2400 ? Pourrait on étendre le principe appliqué à un nombre quelconque de décimales ?  
 
Réponses
J'ai trouvé les réponses à ces épineuses questions dans un livre passionnant et très bien illustré (que je recommande) "Le fascinant nombre Pi" par Jean-Paul Delahaye, aux éditions Pour La Science - Belin (ISBN : 2-9029-1825-9) pages 94 à 98.
 
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.
 
 
 
--------------------------------------------------
------------------------------
 
 
Pour avoir d'autres informations sur les algorithmes de calcul du nombre Pi et de bien d'autres constantes je vous conseille de visiter le site de Simon Plouffe.

Reply

Marsh Posté le 17-11-2001 à 10:31:22    

J'ai un vieux souvenir d'un SVM (donc il doit y avoir 10 ans) d'un programme de cinq lignes avec une random au beau milieu, capable de calculer une approximation de PI.
 
En fait, c'était un calcul a partir du random, la probabilité que je sais plus qeul evenement arrive etait de 2/PI.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 17-11-2001 à 10:54:40    

Pour le random, y la méthode du carré et du disque.
Tu tires au sort un ensemble de point (x,y) avec -1<x,y<1.
A long terme tu dois remplir un carré.
Ensuite tu comptes les points tirés qui sont dans le disque de rayon 1 (c a d x^2+y^2<1).
Asymptotiquement (avec un générateur vraiment aléatoire), les points qui appartiennent au disques doivent représenter (Pi/4)*100 pourcents de l'ensemble des points tirés.
Mais ce doit être la méthode la moins performante pour calculer Pi :D

Reply

Marsh Posté le 17-11-2001 à 10:59:34    

Verdoux a écrit a écrit :

 
Mais ce doit être la méthode la moins performante pour calculer Pi :D  




 
Ouais, c'était ça. Un peu l'équivalent du bogo-tri quoi :)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 17-11-2001 à 12:04:06    

nur a écrit a écrit :

J'ai trouve ça:
 
 
Je suis un jour tombé sur un petit programme de 10 lignes, écrit en langage C dans un style pour le moins concis (les développeurs apprécieront), et ayant l'étonnante propriété de calculer les 2 400 premières décimales de Pi (2 399 pour être tout à fait exact, si l'on considère que le premier chiffre 3 représente la partie entière).
 
L'auteur en est inconnu et le principe appliqué m'échappe totalement.
 
Voici le petit bijou :
 
#include <stdio.h>  
void main(void)
{
int a = 10000, b, 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);  
  }
}
 




 
 
y a quand même un truc bizarre... quand je fais tourner ça chez moi ça donne ça:
21473484800000000000000000000000000000000000000000
00000000000000000000000004604713927558339751484737
88757927589161053545195501171215837335851194136599
82846255724372098597713681408195225439054493969286
89696644730764889389056032515431941984852816168089
26610181492088591421511155251351360237772842655307
08812803853027603998547542699991954951701307550684
48538982547600543269434238083048662409773319262374
62405255685101484197006039344375145523736555376871
38903207996781778822148125037675907388702413257434
90571621751430647884985732476330493121604249894292
14512177613334958660511707167104278532000320626833
7688311813111805564790699731863573082103
34666939400847283710542588387326967012468573454808
44229406409586017231309332964615742758901977873815
32078779258456025456246273489346754818064674288475
46529848456153580945014982557365276849946872268799
56247683347490943267356578090649668256785856143121
88972928542621415567990361675821334634745259038838
31554253489910233373
93607073039917195767715227325233308013216011081082
72984533734722630521746515537946212147506569330274
12562518134241513837250243930039696023536657859241
36026539142452227181912314316859542277636944295371
89623306792373788827690915346129037802103599730737
48469105707782858579130623151770555914510381099346
34513263819213993308
15813010997499155126524231164263628744954831791359
79281353562567509421509296039939513503569352586026
88179581112972369048234031977402690626602269688941
80254208974725320794980687811173911148055368108523
01072889222886365353185723407888326756338629086945
34517812211358064599798675513105151903833288112675
80401861134671751881
90637427338697041823064204940873763203670480672076
56664365082496350079778903205425301669982747994849
17891454264013687531246448099038280498596722728073
81229039076932587083449695756265701807865553224862
89131136282081887051564751931781217653783489267146
31651483453893450924939776969882016789694375277395
19585590438890234120
83093358654850110738274804678264668571082780570558
96771871399279095290288939886389753336259164621320
20437263361529775305241488796939010079000965000423
48555200594988105049282872003074694047968187728772
52899979005466500442392772199125603789939936801988
47158800713737988076389181681054932846159671592324
79159761513273219496
15621577662254023365539837093785323541164830321346
13397199172848511936278006483374006351703509649188
97521794912139654114671603843600772770745728575361
9700437241945645

 

[edtdd]--Message édité par antp--[/edtdd]


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2001 à 12:04:06   

Reply

Marsh Posté le 17-11-2001 à 12:41:17    

antp a écrit a écrit :

 
 
 
y a quand même un truc bizarre... quand je fais tourner ça chez moi ça donne ça:
21473484800000000000000000000000000000000000000000
 
00000000000000000000000004604713927558339751484737
 
88757927589161053545195501171215837335851194136599
 
82846255724372098597713681408195225439054493969286
 
89696644730764889389056032515431941984852816168089
 
26610181492088591421511155251351360237772842655307
 
08812803853027603998547542699991954951701307550684
 
48538982547600543269434238083048662409773319262374
 
62405255685101484197006039344375145523736555376871
 
38903207996781778822148125037675907388702413257434
 
90571621751430647884985732476330493121604249894292
 
14512177613334958660511707167104278532000320626833
 
7688311813111805564790699731863573082103
34666939400847283710542588387326967012468573454808
 
44229406409586017231309332964615742758901977873815
 
32078779258456025456246273489346754818064674288475
 
46529848456153580945014982557365276849946872268799
 
56247683347490943267356578090649668256785856143121
 
88972928542621415567990361675821334634745259038838
 
31554253489910233373
93607073039917195767715227325233308013216011081082
 
72984533734722630521746515537946212147506569330274
 
12562518134241513837250243930039696023536657859241
 
36026539142452227181912314316859542277636944295371
 
89623306792373788827690915346129037802103599730737
 
48469105707782858579130623151770555914510381099346
 
34513263819213993308
15813010997499155126524231164263628744954831791359
 
79281353562567509421509296039939513503569352586026
 
88179581112972369048234031977402690626602269688941
 
80254208974725320794980687811173911148055368108523
 
01072889222886365353185723407888326756338629086945
 
34517812211358064599798675513105151903833288112675
 
80401861134671751881
90637427338697041823064204940873763203670480672076
 
56664365082496350079778903205425301669982747994849
 
17891454264013687531246448099038280498596722728073
 
81229039076932587083449695756265701807865553224862
 
89131136282081887051564751931781217653783489267146
 
31651483453893450924939776969882016789694375277395
 
19585590438890234120
83093358654850110738274804678264668571082780570558
 
96771871399279095290288939886389753336259164621320
 
20437263361529775305241488796939010079000965000423
 
48555200594988105049282872003074694047968187728772
 
52899979005466500442392772199125603789939936801988
 
47158800713737988076389181681054932846159671592324
 
79159761513273219496
15621577662254023365539837093785323541164830321346
 
13397199172848511936278006483374006351703509649188
 
97521794912139654114671603843600772770745728575361
 
9700437241945645  
 
 




 
Oui effectivement(j'avais pas encore testé)y a comme un problème.
 
c'est peut etre du a l'initialisation des variables ?
il faudrait tester en mettant un getch()apres le printf.

Reply

Marsh Posté le 17-11-2001 à 13:29:19    

bhen c'est ce que j'ai fait pour avoir le temps de copier/coller le truc, mais qu'est-ce que le getch() changerait à ce que le printf affiche ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 17-11-2001 à 14:05:23    

HelloWorld a écrit a écrit :

;)
y'a enormement de sites sur ca
http://www.peripheria.net/calcul/
http://trucsmaths.free.fr/Pi.htm
http://www.nombrepi.com/
...
mais celui-ci devrait te convenir
c'est du pascal (faudra qq modif pour delphi mais ca devrait aller ;))
http://www.chez.com/algor/math/pi.htm
 
au fait, pkoi dis tu que Delphi est gratos ?  




 
Ben oui, Delphi personnel est gratos.
DLable sur www.developpez.com www.telecharger.com www.borland.com

Reply

Marsh Posté le 17-11-2001 à 14:05:48    

Merci de vos algos, c sympa.

Reply

Marsh Posté le 17-11-2001 à 18:33:55    

"Ben oui, Delphi personnel est gratos"
savais pas  
merci pour l'info


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 18-11-2001 à 00:16:00    

pi c pas la différence entre l'air d'un cercle et l'air d'un hexagone d'une certaine taille ? c un vague souvenir de 5ème, je raconte surement des conneries
 
-->sinon le prog en C y roxxe...mais la syntaxe est hardcore pour un newbie, merci pour la traduction


---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 18-11-2001 à 03:08:04    

Pi = somme de k=1 à l'infini de ( (-1)^k *(4/(2k-1)) )
et c'est pas des conneries...
4-4/3+4/5-4/7+4/9.... ca fait Pi... c'etait dans science et vie...

Reply

Marsh Posté le 19-11-2001 à 13:53:46    

S'il y avait assez de place, je dois avoir sur un vieux CD le résultat d'un projet Gutenberg qui consistait à calculer les 1 000 000 premières décimales de PI. Y a pas d'algo, que des décimales .... :D  :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed