Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/02/2014, à 13:18

Torman

configurer python

Bonjour,

En faisant des opérations avec Python je me suis rendu compte qu'il y avait des erreur dans les calculs avec les nombres décimaux. J'ai pu lire qu'il faut modifier l'exécutable Python pour y ajouter quelques lignes de code. Par exemple, il m'affiche a = 3.300000007 au lieu de a = 3.3
Il me semble avoir trouvé le fichier à modifier (python3.2mu), mais je n'arrive pas à l'ouvrir.

http://imagik.fr/view-rl/77743


Merci pour votre aide ! smile

Dernière modification par Torman (Le 23/02/2014, à 13:32)

Hors ligne

#2 Le 23/02/2014, à 14:40

Braun

Re : configurer python

Bonjour,
Quels sont les droits de ton fichier "python3.2mu"?

Hors ligne

#3 Le 23/02/2014, à 19:55

Torman

Re : configurer python

Je les ai modifiés afin que le fichier ne soit plus exécutable, donc théoriquement je pense que je devrais pouvoir l'ouvrir mais je n'y parvient pas.

-rw-rw-rw- 1 hector hector  2788224 sept. 25 20:27 python3.2mu

Hors ligne

#4 Le 23/02/2014, à 23:01

tiramiseb

Re : configurer python

Salut,

je me suis rendu compte qu'il y avait des erreur dans les calculs avec les nombres décimaux.
[...]
a = 3.300000007 au lieu de a = 3.3

Là ce ne sont pas des décimaux, ce sont des flottants. Ces erreurs sont liées au fonctionnement des processeurs, c'est le cas dans tous les langages qui bossent avec des flottants.

En Python, pour travailler sur des valeurs exactes, il faut utiliser le type Decimal.

sebastien@amaretto:~$ python3
Python 3.3.2+ (default, Oct  9 2013, 14:50:09) 
[GCC 4.8.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 9.9/3
3.3000000000000003
>>> from decimal import Decimal
>>> Decimal('9.9')/3
Decimal('3.3')
>>> float(Decimal('9.9')/3)
3.3

Hors ligne

#5 Le 23/02/2014, à 23:03

tiramiseb

Re : configurer python

Et d'ailleurs...

Il me semble avoir trouvé le fichier à modifier (python3.2mu)

Que voudrais-tu y faire comme modification ?

Hors ligne

#6 Le 24/02/2014, à 10:42

Torman

Re : configurer python

Merci pour vos réponses, en fait sur ce site : http://wikipython.flibuste.net/CalculerJuste
j'ai vu qu'il était possible de modifier le comportement de l'interpréteur pour pouvoir afficher des nombres exactes sans utiliser de fonction particulière.

"On peut modifier le comportement de l'interpréteur en changeant la fonction d'affichage de l'interpréteur interactif de la sorte :

import __builtin__
def mondisplay(o):
     if o is None: return
     __builtin__._ = None
     print o
     __builtin__._ = o

import sys
sys.displayhook = mondisplay

Ajoutez ce morceau de code dans votre fichier 'startup', chez moi c'est .pythonrc.py qui est défini par la variable d'environnement PYTHONSTARTUP sous Linux (voir les docs correspondantes sous Mac et sous Windows)"

J'aimerais essayer d'ajouter ce morceau de code au démarrage de l'interpréteur pour avoir à éviter d'invoquer la fonction Decimal() à chaque fois smile

Hors ligne

#7 Le 24/02/2014, à 10:55

tiramiseb

Re : configurer python

Ce que tu cites, ça ne dit pas de modifier l'interpréteur, ça dit de modifier le fichier pointé par la variable d'environnement PYTHONSTARTUP. Alors pourquoi veux-tu modifier l'exécutable, qui n'est pas du code Python ?

Et ça n'est que de l'affichage, ça ne change pas du tout le fonctionnement interne de Python. L'« erreur » de calcul est toujours là.

Tout ce que ça change, c'est qu'au lieu d'afficher la valeur de la variable, ça l'instancie d'abord en string (grâce à la ligne "print").



La même action sans la fonction que tu montres :

>>> tva = 17.5/100
>>> prix=3.50
>>> prix*tva
0.6124999999999999
>>> print(prix*tva)
0.6125
>>> str(prix*tva)
'0.6125'

Donc il ne s'agit bien que d'un affichage, car j'arrive au même résultat en appelant print ou en instanciant en str tout seul...



Un problème que tu peux rencontrer si tu utilises la fonction que tu montres :

>>> import __builtin__
>>> def mondisplay(o):                                                                                                             
...      if o is None: return                                                                                                      
...      __builtin__._ = None                                                                                                      
...      print o                                                                                                                   
...      __builtin__._ = o                                                                                                         
...                                                                                                                                
>>> import sys                                                                                                                     
>>> sys.displayhook = mondisplay                                                                                                   
>>> tva = 17.5/100                                                                                                                 
>>> prix=3.50                                                                                                                      
>>> prix*tva                                                                                                                       
0.6125                                                                                                                             
>>> prix*tva == 0.6125                                                                                                             
False

... eh ouais... La valeur de "prix*tva" reste 0.6124999999999999, ça n'est donc pas égal à 0.6125...

Mettre en application ce truc que tu as lu, c'est du même acabit que de mettre les mains devant les yeux et dire "lalalalala j'ai rien vu"...


Tu peux lire ça pour en apprendre plus sur le problème avec les flottants :
http://docs.python.org/3/tutorial/floatingpoint.html

Hors ligne

#8 Le 24/02/2014, à 11:12

Torman

Re : configurer python

Merci pour cette réponse rapide et très précise smile

En fait je suis tombé sur ce problème parce que j'augmentais une variable de 0.1 en 0.1 jusqu'à ce qu'elle vaille 20. Par exemple :

a = 0
c = 0                                   # compteur quelconque

while c < 10 :
     a = a + 0.1
     if a == 20 :
            c = c + 1
            a = 0

Du coup dans ce programme ma variable a n'est jamais égale à 20, elle dépasse 20 mais n'y est jamais égale.
Existe-t-il un moyen de régler ce problème ou faut-il simplement "ruser" un peu en utilisant plutôt des dépassements de seuils ?

Hors ligne

#9 Le 24/02/2014, à 11:34

tiramiseb

Re : configurer python

De manière générale, j'aime bien utiliser des ">=" plutôt que des "==", au cas où la valeur est dépassée...
Après, tu as aussi d'autres moyens, par exemple bosser sur des entiers plutôt que sur des flottants (augmenter a de 1 en 1 jusqu'à 200).


Bon, la boucle que tu montres ne devrait jamais exister en Python : les compteurs de ce genre ça s'utilise peu. Mais j'imagine que c'est un exemple simplifié pour focaliser sur ce problème.
Je t'aurais bien montré une méthode plus "pythonesque" de faire ce que tu veux faire... Mais je ne comprends pas ce que tu veux faire, vue l'abstraction de cette boucle.

Si tu nous montrais ton "vrai" code on pourrait peut-être te donner une méthode plus "pythonesque", en évitant probablement ces boucles "while".



[Par ailleurs, là tu parles d'un programme, et le truc que tu avais trouvé ça s'applique uniquement à l'interpréteur interactif : ça ne s'applique tout simplement pas dans le cadre d'un programme]

Hors ligne

#10 Le 24/02/2014, à 11:55

Torman

Re : configurer python

En fait notre professeur de maths nous a donné un exo qui est de compter toutes les possibilités de faire 100€ avec des pièces de 10, 20 et 50 centimes.
Du coup l'idée était de faire augmenter les variables correspondant aux pièces de 10, 20 et 50 centimes tour à tour pour trouver toutes les possibilités.
On augmente a (10 centimes) de 0.1 en 0.1 jusqu'à 100, une fois à 100 on compte une possibilité en plus, a vaut à nouveau 0 et la variable pour les pièces de 20 centimes( b par exemple) est augmentée de 0.2. Une fois que b vaut 100, a = 0, b = 0, et une nouvelle variable c (pièces de 50 centimes) est augmentée de 0.5, et ainsi de suite.

Bon je sais pas si c'est très clair mais en tout cas le programme que je souhaite faire est celui qui permettrais de répondre au problème posé smile

Hors ligne

#11 Le 24/02/2014, à 12:02

tiramiseb

Re : configurer python

Ok je vois le truc.

Bah je vois deux approches...

1/ utiliser des Decimal :

from decimal import Decimal
dix_centimes = Decimal('0.1')
vingt_centimes = Decimal('0.2')
cinquante_centimes = Decimal('0.5')

... puis utiliser ces variables au lieu de "0.1" (et autres) dans le code des incréments.


2/ travailler sur les centimes (donc incrémenter des entiers jusqu'à 10000 centimes au lieu de 100 euros)



Cela étant dit, n'y aurait-il pas un algorithme mathématique plus simple que ça pour faire ce genre de comptes ?
Si ton prof de maths te donne un exo, c'est peut-être pas pour que tu fasses ça d'une manière très "bourrin" avec des boucles dans un script Python smile

Dernière modification par tiramiseb (Le 24/02/2014, à 12:03)

Hors ligne

#12 Le 24/02/2014, à 13:02

Torman

Re : configurer python

Cet exo n'est en fait pas à traiter avec un programme mais bon comme c'est aussi un moyen de trouver la réponse, je voulais essayer. En tout cas merci beaucoup pour tes réponses et ton aide. Je pense que maintenant j'arriverai à faire le programme smile

Hors ligne