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

Posted

技术标签:

【中文标题】为啥 numpy.power 为小指数返回 0 而 math.pow 返回正确答案?【英文标题】:Why does numpy.power return 0 for small exponents while math.pow returns the correct answer?为什么 numpy.power 为小指数返回 0 而 math.pow 返回正确答案? 【发布时间】:2014-05-22 06:38:37 【问题描述】:
In [25]: np.power(10,-100)
Out[25]: 0

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

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

【问题讨论】:

【参考方案1】:

哦,比那更“糟糕”:

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

【讨论】:

这绝对应该与 numpy 模块一起提供自动警告【参考方案2】:

numpy 方法假定您希望返回整数,因为您提供了一个整数。

np.power(10.0,-100) 

如您所愿。

【讨论】:

【参考方案3】:

(只是此页面上其他两个答案的脚注。)

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

>>> 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 浮点型用d (documents) 表示。

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

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

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

【讨论】:

以上是关于为啥 numpy.power 为小指数返回 0 而 math.pow 返回正确答案?的主要内容,如果未能解决你的问题,请参考以下文章

python:为啥将i计算为指数后float的零检测失败?

为啥 xml-to-json 函数返回指数符号?

为啥微软雅黑字体打印出来大小不一?电脑显示正常,字号为小四,求解~

为啥 any('') 返回逻辑 0 而 all('') 返回逻辑 1?

为啥 QStandardItemModel 的成员函数 children().size() 返回 0,而函数 hasChildren() 返回 true?

为啥我的 array.length 返回这么高的数字?