python - 我发现了一些奇怪的东西
问题描述
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 上。
解决方案
您生成的整数大于您的平台或默认 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))
推荐阅读
- c++ - 如何从调试符号中排除外部依赖项?
- gpu - PyTorch:多 GPU 错误:RuntimeError:binary_op():预期两个输入都在同一设备上,但输入 a 在 cuda:0 上,输入 b 在 cuda:7 上
- ffmpeg - ffmpeg 提供文本和文本文件。请只提供一个
- angular - 2 个观察者,并且必须根据值返回其中之一
- apache-spark - 对于时间序列汇总/聚合,流处理是否优于批处理?
- domino-appdev-pack - 在快速入门和 bulkReadDocuments 的示例代码中获取“UnhandledPromiseRejectionWarning: Error”
- excel - 通过 VBA 将坐标从 excel 导入 Autodesk Inventor
- java - 发送多个请求以获得最终响应或保留第一个请求?
- python - Keras 中的深度连接
- reactjs - 如何将 node_modules 的 kentico-cloud-delivery 的 package.json 中的更改推送到 bitbucket