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

Etiquettes: 

Commentaires

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.

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.

Si pour le nombre P tu lui donnes un nombre impair (100000017), tu vois ce que ça donne comme résultat ?

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.

if i%2 == 0:
        z = Decimal.copy_negate(z)

sinon, ça ne peut pas fonctionner.....

Merci pour avoir détecté l'anomalie ;-)

Autrement si tu veux absolument le calculer tu fais : pi = 4. * numpy.arctan(1.)
Mais c'est moins fun.

mais ça permet d'enrichir ses connaissances.

Merci pour le partage ;-)

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.