为什么numpy.power为小指数返回0而math.pow返回正确的答案?

时间:2014-04-09 07:52:38

标签: python numpy exponentiation

In [25]: np.power(10,-100)
Out[25]: 0

In [26]: math.pow(10,-100)
Out[26]: 1e-100

我希望这两个命令都返回1e-100。这也不是精确问题,因为即使将精度提高到500之后问题仍然存在。是否有一些设置我可以更改以获得正确的答案?

3 个答案:

答案 0 :(得分:71)

哦,它更糟糕"更糟糕"那个:

In [2]: numpy.power(10,-1)   
Out[2]: 0

但这是对正在发生的事情的暗示:10是一个整数,而numpy.power并未将这些数字强制转换为浮点数。但这有效:

In [3]: numpy.power(10.,-1)
Out[3]: 0.10000000000000001

In [4]: numpy.power(10.,-100)
Out[4]: 1e-100

但请注意,幂运算符** 转换为float:

In [5]: 10**-1
Out[5]: 0.1

答案 1 :(得分:35)

numpy方法假设您希望在提供整数后返回整数。

np.power(10.0,-100) 

按预期工作。

答案 2 :(得分:2)

(这是本页另外两个答案的脚注。)

给定输入两个输入值,您可以通过检查np.power属性来检查types将返回的对象的数据类型:

>>> np.power.types
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q', 
 'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O']

与Python兼容的整数类型由l表示,兼容兼容的Python浮点数由ddocuments)表示。

np.power通过检查传递的参数类型并使用此列表中的第一个匹配签名来有效地决定返回的内容。

因此,给定10和-100,np.power匹配integer integer -> integer签名并返回整数0

另一方面,如果其中一个参数是浮点数the integer argument will also be cast to a float,则使用float float -> float签名(并返回正确的浮点值)。