2009-06-14 10 views
0

Quand je fais 1/2 en Python pourquoi me donne-t-il zéro? Même si je le contrains avec float(1/2) encore je reçois zéro. Pourquoi? Et comment puis-je le contourner?Erreur lors de l'utilisation de math.atan en Python!

Lorsque je donne arctan(1/2) je reçois 0 comme réponse, mais quand je donne arctan(.5) j'obtiens la bonne réponse!

Répondre

7

Parce que Python 2.x utilise la division entière pour les entiers, donc:

1/2 == 0 

est évaluée à vrai.

Vous voulez faire:

1.0/2 

ou de faire une

from __future__ import division 
2
float(1)/float(2) 

Si vous divisez int/int vous un int, ce flotteur (0) vous donne encore 0,0

3
atan(float(1)/2) 

Si vous faites:

atan(float(1/2)) 

en Python 2.x , mais sans:

from __future__ import division 

le 1/2 est d'abord évalué comme 0, puis 0 est converti ed à un flottant, alors atan (0.0) est appelé. Cela change dans Python 3, qui utilise la division float par défaut même pour les entiers. La solution portable courte est ce que j'ai d'abord donné.

+0

Python 3 change cela? Ça va me déranger. Je suis habitué à tout faire avec des entiers, en C, puisque je suis un ingénieur logiciel embarqué. –

+0

Oui. Voir http://www.python.org/dev/peps/pep-0238/. Vous pouvez toujours utiliser // pour tronquer. –

2

de la norme:

Le/(division) et // (division étage) le quotient opérateurs cèdent de leurs arguments. Les arguments numériques sont d'abord convertis en un type commun. La division en nombres entiers simples ou longs donne un nombre entier du même type; le résultat est celui de la division mathématique avec la fonction 'floor' appliquée au résultat.

1

Comme ces réponses sont ce qui implique, 1/2 ne retourne pas ce que vous attendez. Il renvoie zéro, car 1 et 2 sont des entiers (la division entière provoque l'arrondi des nombres). Python 3 modifie ce comportement, d'ailleurs.

1

Votre contrainte n'a aucune chance, car la réponse est déjà zéro avant de la laisser flotter.

Essayez 1./2

1

En Python, la division des entiers donne un entier - 0 dans ce cas.

Il existe deux solutions possibles. L'un est de les forcer dans les flotteurs: 1/2. (notez le point arrière) ou flottez (1)/2. Un autre est d'utiliser "de future division d'importation" en haut de votre code, et d'utiliser le comportement dont vous avez besoin.

python -c 'de future division des importations, les mathématiques à l'importation, l'impression Math.atan (1/2)' donne le ,463647609001 correct

1

Si 1/2 == 0 puis flotteur (1/2) sera 0.0.Si vous le forcer à flotter après qu'il a été tronqué, il sera toujours tronqué.

Il y a quelques options:

  • Ajouter l'importation suivante: from __future__ import division. Cela fera que l'opérateur/divisera "correctement" dans ce module. Vous pouvez utiliser // si vous avez besoin d'une division tronquée.
  • Coerce l'un des opérandes à un flotteur. par exemple: float(1)/2
  • Si vous utilisez réellement des constantes puis simplement ajouter un point décimal au lieu d'utiliser float(), par exemple: 1.0/2 ou 1/2.0 ou 1.0/2.0
6

D'abord, 1/2 est division entière. Jusqu'à Python 3.0.

>>> 1/2 
0 
>>> 1.0/2.0 
0.5 
>>> 

Deuxièmement, utilisez math.atan2 pour ce genre de chose.

>>> math.atan2(1,2) 
0.46364760900080609 
>>> math.atan(.5) 
0.46364760900080609 
Questions connexes