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

54 投票
3 回答
4604 浏览
提问于 2025-04-18 01:59
In [25]: np.power(10,-100)
Out[25]: 0

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

我本来以为这两个命令都会返回1e-100。这个问题不是因为精度不够,因为即使把精度提高到500,问题还是存在。有没有什么设置可以改变,让我得到正确的答案呢?

3 个回答

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 表示,浮点数类型用 d 表示(文档)。

np.power 会根据传入参数的类型来决定返回什么,它会使用这个列表中的第一个匹配的类型签名。

所以,当输入是10和-100时,np.power 匹配到 integer integer -> integer 的签名,返回整数 0

另一方面,如果其中一个参数是浮点数,那么 整数参数也会被转换为浮点数,这时会使用 float float -> float 的签名(并返回正确的浮点值)。

34

numpy这个方法会认为你想要返回一个整数,因为你给它提供了一个整数。

np.power(10.0,-100) 

它的表现和你预期的一样。

72

哦,情况比这更“糟糕”:

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

不过要注意,幂运算符 ** 是会转换成浮点数的:

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

撰写回答