为什么numpy.power对小指数返回0而math.pow返回正确答案?
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