Python: Calculer le nombre PI
Le nombre π (3,1415.........), peut être calculé à l'aide de la formule suivante:
π = (4/1) - (4/3) + (4/5) - (4/7) + (4/9) - (4/11) + (4/13) etc etc ...
On démarre les opérations avec le numérateur "4", que l'on conserve jusqu'à la fin, et le dénominateur 1 que l'on incrémente de 2 à chaque opération en alternant soustraction et addition.
Plus le nombre d'itération est important, plus la précision sera importante.
Une petite boucle en Python permet de calculer π avec une bonne précision.
Dans l'exemple suivant, je vais boucler 100 millions de fois afin d'avoir une valeur de π avec 27 chiffres après la virgule, mais comme le souligne Matt, avec une précision de seulement 7 chiffres après la virgule, et cela en quelques minutes seulement.
>>> from decimal import Decimal
>>> P = 100000000 # attention, nombre pair obligatoire (voir commentaire)
>>> C = Decimal(4) / 1
>>> I = 1
>>> for i in range(P, 0, -1):
z = Decimal(4) / (I+2)
if i%2 == 0:
z = Decimal.copy_negate(z)
C += z
I += 2
>>> print(C)
3.141592663589793138462645118
Mais il est quand même plus rapide d'utiliser la fonction suivante:
>>> from math import pi
>>> print(pi)
3.141592653589793
C'était juste pour le fun
Commentaires
Matt (non vérifié)
sam, 05/05/2018 - 00:36
Permalien
Attention avec les
Attention avec les manipulations de décimaux en Python. Les décimaux permettent de faire du calcul en valeurs exactes, en évitant les approximations liées aux float, mais pour que ça marche, il faut que toutes les opérations soient faites sur des décimaux.
Dans votre exemple, vous faites dans chaque itération une division en float (4/(I+2)) puis convertissez le résultat en décimal. Ainsi, vous perdez le bénéfice de la précision du décimal sur l'opération de division.
Petit test pour s'en rendre compte :
>>> Decimal(1/3)
Decimal('0.333333333333333314829616256247390992939472198486328125')
On voit qu'à partir de la 17ème décimale le résultat est incorrect. Si par contre on passe en décimal avant d'appliquer la division, c'est bon :
>>> Decimal(1)/3
Decimal('0.3333333333333333333333333333')
Autre petit détail avec les nombres à virgule quand on fait des approximations : un nombre affiché avec 27 chiffres après la virgule ne signifie pas qu'on a une précision de 27 chiffres après la virgule.
En l'occurrence, la valeur de Pi calculée avec cette méthode diverge de Pi dès la 8ème décimale (6 au lieu de 5).
La précision n'est donc ici que de 7 chiffres après la virgule. La formule de Leibniz converge très lentement vers Pi, donc, il faudrait beaucoup plus de 100M d'itérations pour avoir 27 chiffres de précision.
ronan
sam, 12/05/2018 - 09:35
Permalien
Merci beaucoup
pour toutes ces précisions.
Effectivement, je n'avais jamais fait attention à ce détail sur les décimaux.
Il est vrai que dans mon exemple, je n'avais pas remarqué l'erreur à la huitième décimale.
Guy (non vérifié)
jeu, 17/01/2019 - 01:06
Permalien
Le nombre pi
Si pour le nombre P tu lui donnes un nombre impair (100000017), tu vois ce que ça donne comme résultat ?
ronan
jeu, 17/01/2019 - 15:05
Permalien
Effectivement,
J'ai oublié de préciser que la formule utilisée est celle de Leibniz-Grégory, par conséquent il faut que la première opération effectuée dans la boucle soit une soustraction.
Pour cela, il faut obligatoirement que la première valeur de "i" soit paire, donc P doit être un nombre pair.
sinon, ça ne peut pas fonctionner.....
Merci pour avoir détecté l'anomalie ;-)
Steven (non vérifié)
lun, 23/11/2020 - 11:48
Permalien
Le nombre pi
Autrement si tu veux absolument le calculer tu fais : pi = 4. * numpy.arctan(1.)
Mais c'est moins fun.
ronan
lun, 23/11/2020 - 12:17
Permalien
Effectivement, c'est moins fun
mais ça permet d'enrichir ses connaissances.
Merci pour le partage ;-)
Ajouter un commentaire