当x很小时,np.exp(x)

时间:2018-06-04 11:47:48

标签: python numpy exp

我尝试了以下内容:

import  numpy as np

x = -1.20831312e+05
print np.exp(x)     # answer: x = 0.0
print np.expm1(x)   # answer: x = -1.0

根据Wolfram的说法,它应该是4.24578... × 10^-52477。我怎么能解决这个问题呢?我需要将np.exp(x)x的小值进行比较。

3 个答案:

答案 0 :(得分:4)

您将不得不使用对数刻度。正如@norrius所建议的那样,你可以简单地使用x,但是如果你想把它变成科学记数法,请尝试以下方法:

def exp_to_sci(x):
  coeff, exp = np.modf(x / np.log(10.0))
  return 10**(coeff + 1), exp - 1

如果你在你的例子中尝试,你会得到:

>>> exp_to_sci(-1.20831312e+05)
(4.2457778774122303, -52477.0)

与Wolfram相同的系数和指数。

答案 1 :(得分:3)

您可以使用sympybigfloat

>>> x = -1.20831312e+05
>>> 
>>> import sympy as sp
>>> sp.exp(x)
4.24577787737720e-52477
>>> 
>>> import bigfloat
>>> bigfloat.exp(x)
BigFloat.exact('4.2457778773771979e-52477', precision=53)

答案 2 :(得分:0)

您将numpy中的值存储为64位浮点数。您可以以这种方式存储的最小非零数字是2^(1-1023) = 2^-1022

由于您的号码小于此值,因此会将其存储为0.0