2017-03-29 1 views
0

Comment peut-on calculer un nombre tel que np.exp (-28000) sur Python? La réponse est vers 5E-12161. On m'a dit qu'en raison du format à virgule flottante à double précision, je serais seulement capable de calculer un nombre> 1e-2048Exponentiel de grands nombres négatifs

+0

quel est le problème avec np.exp (-28000)? – Eric

+0

J'obtiens 0.0 pour np.exp (-28000) –

+0

Qu'allez-vous faire avec ce numéro? Pouvez-vous organiser vos calculs de sorte que vous avez seulement besoin de travailler avec les logarithmes des nombres? -28000 est beaucoup plus facile à utiliser qu'avec exp (-28000). –

Répondre

0

Essayez le module décimal.

Decimal(math.exp(1))**-28000 
+0

Merci! Maintenant, j'ai besoin de comprendre comment faire cela pour un tableau –

+0

@DanielGeorge: J'ai ajouté une approche pour le faire fonctionner sur les tableaux. Jetez un coup d'oeil s'il vous plait. – kmario23

1

Essayez mpmath pour l'arithmétique en virgule flottante avec une précision arbitraire

Edit 1:

>>> import mpmath as mp 
>>> import numpy as np 
>>> a = np.matrix((0,0)) 
>>> print(a) 
[0.0 0.0] 
>>> b = mp.matrix(a.tolist()) 
>>> c = b.apply(mp.exp) 
>>> print(c) 
[1.0] 
[1.0] 
+0

J'ai essayé d'installer ce module en utilisant pip mais il ne s'est pas montré pendant la compilation. En outre, j'essaie de trouver l'exponentielle d'un tableau et j'ai entendu que mpmath ne le fait pas. –

+0

Pour la matrice mpmath, des opérations de type baie peuvent être effectuées. Veuillez voir l'exemple ci-dessus – arduinolover

+0

@arduinolover: Cela ne fonctionnait pas pour les tableaux chiffrés et je ne sais pas comment convertir les tableaux chiffrés au format mp. – kmario23

0

Vous pouvez définir une fonction pour calculer la « bigexponent » et l'appliquer à l'ensemble (le long un axe). Mais, notez que le tableau d'entrée doit être de type int.

# solution courtesy: http://stackoverflow.com/a/43084475/2956066 
In [97]: def bigexp(x): 
    ...:  return Decimal(math.exp(1))**x 


In [98]: np.apply_along_axis(bigexp, 1, arr)  

efficacité (par ordre décroissant)

# twice faster than applying along axis 0 
In [115]: %timeit np.apply_along_axis(bigexp, 1, a) 
1000 loops, best of 3: 272 µs per loop 

In [116]: %timeit np.apply_along_axis(bigexp, 0, a) 
1000 loops, best of 3: 465 µs per loop 
+0

J'ai essayé d'utiliser votre méthode, mais je reçois cette erreur: ValueError: axe doit être inférieur à arr.ndim; axe = 1, rang = 1. S'il vous plaît voir la question complète j'ai posté: http://stackoverflow.com/q/43100725/6943476 –