【问题标题】:Power over integer in python 3python 3中的整数幂
【发布时间】:2018-09-02 11:14:20
【问题描述】:

尝试在 Python 3.6.5 中计算长整数的幂,结果为 0。这是预期的行为吗?然后它与官方文档相矛盾。

In [16]: i
Out[16]: 16777216

In [17]: i**2
Out[17]: 0

In [18]: float(i)**2
Out[18]: 281474976710656.0

【问题讨论】:

  • 此处无法复制
  • @Caramiriel 你不能在 Python 3.6 中定义为 long 吗?
  • @roganjosh 不确定,但我不这么认为? python.org/dev/peps/pep-0237(啊,是的,我只是想让它工作)
  • 16777216**2 结果为 281474976710656。这里没有什么奇怪的事情发生。 (Python 版本 3.5.2)。

标签: python


【解决方案1】:

只有当i 不是int 时才会发生这种情况。可以通过运行找到i的类型:

print(type(i))


在 Python 中,可以定义一个看起来像 int 的类,并定义自己的 __pow__() 方法。因此,如果没有更多细节,很难知道发生了什么。

我已经能够重现类似的行为:

import numpy as np
i = np.int64(4294967296)
print (i**2)

但它也会打印一个警告:

__main__:3: RuntimeWarning: overflow encountered in long_scalars

这种行为对于 numpy 来说是正常的,因为它定义了具有溢出语义的有限整数类型。 np.int64 只有 64 位,取幂的高位被简单地丢弃。由于 4294967296 = 232,那么 (232)2 太大而无法容纳 64 位。由于唯一的非零位是位 64,它太高了,所以溢出后只剩下零位。这对于 numpy 整数类型是正常的。


当我尝试online python 时,numpy.int64 溢出时甚至没有警告。

【讨论】:

    【解决方案2】:

    鉴于所提供的信息量很少,重现此行为的唯一方法是创建一个覆盖 __pow__ 方法的自定义类。
    例如,

    >>> class myInt(int):
    ...     def __pow__(self,x):
    ...             return 0
    ... 
    >>> i = myInt(16777216)
    >>> i
    16777216
    >>> i**2
    0
    >>> float(i)**2
    281474976710656.0
    

    【讨论】:

      【解决方案3】:

      也许这个问题可以结束了。实际上,上面的 i 变量不是 Python int 类型。这是解释。

      In [2]: a = np.ndarray((256, 256, 256))
      In [3]: i = np.prod(a.shape)
      In [4]: i
      Out[4]: 16777216
      In [5]: type(i)
      Out[5]: numpy.int32
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 2016-06-10
        相关资源
        最近更新 更多