2016-05-24 2 views
0
0 == ((-1)**.5).real 

... est faux en python 3.5.1, alors que:python: pourquoi la détection du zéro du flotteur échoue-t-elle après avoir calculé i comme exposant?

0 == complex(0,1).real 

... est vrai. Comment ces deux cas sont-ils traités différemment? quand les fonctions de détection de zéro de la classe float fonctionnent-elles et quand ne le font-elles pas?

+2

'(-1) ** 0.5 -> (6.123233995736766e-17 + 1j)' sur ma machine, je suppose que c'est à cause de [maths en virgule flottante] (http://stackoverflow.com/questions/588004/ is-floating-point-math-broken) –

Répondre

6
>>> (-1)**0.5 
(6.123233995736766e-17+1j) 

Voilà tout ce qui est à elle - en raison de caprices à virgule flottante, la partie réelle du résultat calculé est pas exactement zéro. Mais dans l'autre cas, il est:

>>> complex(0,1).real 
0.0 

Par ailleurs, une routine ** invoque usage général exponentiation, qui ajoute plusieurs couches d'erreurs d'arrondi à virgule flottante sous les couvertures. Si vous savez que vous voulez une racine carrée, il est préférable d'utiliser une fonction racine carrée:

>>> import cmath 
>>> cmath.sqrt(-1) 
1j 
2

La puissance fractionnaire est calculée - en simplifiant quelque peu - comme r cis thêta. Puisque theta (pi) ne peut pas être exactement représenté comme une fraction binaire, le résultat n'est pas exactement ce que vous attendez d'un calcul manuel. Il existe différentes fonctions «égales dans une tolérance» que vous pouvez appliquer pour contourner ce problème.

+0

Certaines de ces fonctions sont déjà en place et fonctionnent: 2 == 4 ** 0.5. Je ne suis pas clair sur quand s'attendre à ce qu'ils travaillent et quand pas. –