我尝试了以下内容:
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
的小值进行比较。
答案 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)
您可以使用sympy
或bigfloat
:
>>> 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
。