C.Ret a écrit :[...]Bref, j'ai pas à ce jour réussi à faire fonctionner ce programme et obtenir la moindre décimale de PI !
C'est un peu frustrant. J'avais déjà trouvé cet article il y a longtemps et n'avait pas non plus à l'époque réussit à modiifer ce programme pour avoir PI en un temps décent.
J'ai donc cherché à mieux comprendre la méthode.
Par chance, elle est bien expliquée sur ce site :
http://serge.mehl.free.fr/anx/pi_100deci.html
J'ai donc adapté l'algorithme donné pour mon pauvre SHARP PC-1211.
Cela donne un programme d'environ 217 STEPs qui laisse donc disponible 175 MEMORIES pour stocker les décimales de PI, soit un maximum théorique d'environ 1044 décimales. Théorique, car personne n'aura la patience (et les piles) pour arriver à un tel résultat. Il faut quelque(s) fraction(s) de seconde sur un PC pour avoir aussi peu de décimales !
Il doit être possible d'optimiser ce code ou de gagner quelque mémoire, mais est-ce bien utile ?
L'avantage de cette version, qui utilise le même algorithme que le programme de SVI , est que l'on ne pert pas de temps à calculer les décimales au-delà de la limite demandée. Le nombre de registres utilisé (A(6 à E)) dépend du nombre demandé. Les calculs sont donc rapides pour un nombre faible de décimales.
Par contre, le temps croît rapidement en fonction de ce nombre, car très vite chaque division et chaque multiplication prennent d'autant plus de temps que n_max est important.
Code : Tout sélectionner
REM --------------- saisie nombre décimales
1:CLEAR :INPUT D
REM --------------- initialisation - D = nmax, E nombre de block, T(0 à ...) = A(7 à E)=2n_max/(2n_max+1)
2:E=7+INT .2D,D=INT (3+D/LOG 2),G=2D,F=G+1:GOSUB 8
REM --------------- boucle principale To=To+2, divise T() par 2n-1, multiplie T() par n-1
3:PAUSE D:G=G+2:IF D<2 BEEP 1:FOR A=7 TO E:PRINT A(A):NEXT A:END
4:F=2D-1:GOSUB 8:F=D-1:GOSUB 9:D=D-1:GOTO 3
REM - - - - - - - - sous-programme division A(7 à E) par F
8:C=0:FOR A=7 TO E:A(A)=A(A)+€6C,B=INT (A(A)/F),C=A(A)-FB,A(A)=B:NEXT A:RETURN
REM - - - - - - - - sous-programme multiplication A(7 à E) par F
9:C=0:FOR A=E TO 7 STEP -1:B=FA(A)+C,C=INT €-6B,A(A)=B-€6C:NEXT A:RETURN
( € correspond en fait à la touche Exp qui permet de saisir les exposants de 10).
Variables:
A: compteur i
B: quotient/produit/valeur intermédiaire
C: retenue
D: nbr décimales de PI souhaitée / nmax / n
E: nombre/limite registre stockage des décimales: To=A(7)=G .
F: facteur pour respectivement division et multiplication.
G à A(177) :mémorisation de PI avec jusqu'à presque 1000 décimales. En fait 6 décimales par registre mémoire (valeur absolue pour simplifier expression pour des calculs plus rapides).
Quelques essais:
Code : Tout sélectionner
5 dec ( 2'30") *3.14159*1
10dec ( 5'03") *3.141592 6535*85
12dec ( 5'52") *3.141592 653589*
30dec (45' ) *3.141592 653589 793238 462643 383279 502884 19*7165 932036
Pas mal, moins d'une heure pour 30 décimales !
Mais, mon programme affichant 22 décimales sur SHARP-PC1211 le plus rapide est certainement :
Et celui en affichant 46 (mais qui nécessite d'appuyer sur [ENTER] à mi chemin:
Code : Tout sélectionner
10:PRINT "3.141592653589793238462":PRINT "643383279502884197169399":GOTO 10