2017-10-05 12 views
0

J'utilise numpy sous python 2.7 et pensé à utiliser afin de représenter un grand nombre comme 2e315. Cependant, il est traité comme inf, bien qu'il soit inférieur à la représentation maximale autorisée qui est proche de 1e4932.Pourquoi le nombre inférieur au maximum pour float128 dans numpy est traité comme inf?

In [1]: import numpy as np 
In [2]: np.finfo(np.float128) 
Out[2]: finfo(resolution=1e-18, min=-1.18973149536e+4932, max=1.18973149536e+4932, dtype=float128) 
In [3]: np.float128(2E315) 
Out[3]: inf 

L'exemple précédent a été testé à pythonanywhere.com avec python 2.7 et numpy 1.8.1 qui avait des propriétés suivantes:

$ uname -a 
Linux harry-liveconsole4 4.4.0-83-generiC#106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 

J'ai aussi testé l'exemple ci-dessus sous ma machine 64 bits locale, mais a reçu l'erreur AttributeError: 'module' object has no attribute 'float128' et je numpy 1.8.0 là.

Qu'est-ce qui me manque? Quelle architecture devrais-je avoir pour avoir sous Python? Existe-t-il une solution de contournement pour représenter de tels grands nombres non pas comme inf mais pour les laisser tels que je les saisis?

Répondre

2

C'est parce que 2E315 get évalué avant il est passé à et 2E315 évalue flotter ('inf):

>>> 2E315 
inf 

il est alors trop tard. Heureusement, le constructeur accepte une chaîne:

>>> import numpy as np 
>>> np.float128('2e315') 
2e+315 
>>> 

Alors, juste pour vous montrer cela fonctionne:

>>> x = np.float128('2e315') 
>>> x 
2e+315 
>>> x // np.float128('1e312') 
2000.0 

Cela fonctionne aussi pour moi sur Python 2:

>>> import sys, numpy 
>>> numpy.__version__ 
'1.11.3' 
>>> sys.version_info 
sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0) 
>>> numpy.float128('2e315') 
2e+315 
>>> numpy.float128('2e315')/numpy.float128('1e312') 
2000.0000000000000001 
+0

Êtes-vous tester cette sous 'python 2.7'? Parce que j'ai des résultats différents. Pour 'np.float128 ('2e315')' je reçois toujours 'inf' comme résultat. –

+0

Aussi ma version numpy est «1.8.1» –

+0

@CedricZoppolo oui, cela fonctionne pour moi sur Python2 –