首页 > 解决方案 > 我发现了一些奇怪的东西

问题描述

Python 有一个错误。这是代码:

print(np.sum(np.power(range(26), 6)))
print(np.sum(np.power(range(26), 7)))

这给出了以下结果:

998881325
792709145

(x 的 6 次方) 的总和 < (x 的 7 次方) 的总和怎么可能!?!

编辑


我在 Python 3.7.3 和 numpy 1.16.2 上。

标签: pythonpython-3.xnumpy

解决方案


您生成的整数大于您的平台或默认 numpy int 值可以处理的整数,因此会溢出您的数字。

25 的 7 次方需要 33 位:

>>> (25 ** 7).bit_length()
33

Python 的内置整数类型是unbounded,但 numpy 使用有界、固定大小的整数,并且对于您的 numpy 设置,默认的有符号整数类型是int32,因此无法适应此值。

如果我告诉 numpy 将输出转换为,我可以重现完全相同的输出int32

>>> np.sum(np.power(range(26), 7)).astype(np.int32)
792709145

但是因为我在 64 位 CPU 上运行 MacOS,所以 numpyint64用作默认整数类型,因此会产生正确的结果:

>>> np.sum(np.power(range(26), 7))
22267545625
>>> np.sum(np.power(range(26), 7)).dtype
dtype('int64')

792709145是低 31 位表示的整数值:

>>> print(int(format(22267545625, 'b')[-31:], 2))
792709145

然而,在 Windows 上,默认的 numpy 整数类型是 int32,因为即使在 64 位硬件上,Windows 也将 C long int 定义为 32 位值。

您应该告诉 numpy 在此处创建一个 int64 值数组:

np.sum(np.power(np.arange(26, dtype=np.int64), 7))

推荐阅读