python - 确保计算完成 64 位(或至少警告溢出)

标签 python numpy integer-overflow

我正在使用 python 和 NumPy。我需要计算以下基本数量:

(QL * (7**k))**2

在哪里

QL = 200003
k = 4

令我困惑的是它返回了一个错误的(负数)数字,这没有意义。然后我在网上看了之后才意识到问题是因为k是一个32位的numpy整数。

一个最小的工作示例如下:

QL = 200000
k = np.arange(10)[4]
print((QL * 7**k)**2)

这将返回 406556672 而不是正确答案 230592040000000000。这里的数字不是负数,但还是出现同样的问题。

我的问题是:

如何确保我的代码中使用的所有数字都具有最大可能的整数大小?

我不想为我创建的每个数字明确指定它。

我怎样才能至少强制 python 在发生这种情况时警告我?

最佳答案

当你写 QL = 200003; k = 4 在 Python 中,数字被解释为 int。默认情况下,如果您要将它们转换为 numpy 数组或标量,您最终会得到系统上的任何默认整数类型。

这是一个使用单元素数组的例子:

QL = np.array([200003])
k = np.array([4])

在我的系统上,我发现两个数组的dtype 都是int32。您可以通过选择您喜欢的 dtype 来更改它:

QL = np.array([200003], dtype=np.int64)
k = np.array([4], dtype=np.int64)

如果您在创建时无法访问数组,您可以随时转换它们:

QL = QL.astype(np.int64)
k = k.astype(int64)

整数数学值得考虑的一个选项是完全跳过 numpy 并使用 Python 的无限精度整数。如果其中一个数字是 numpy 标量或单元素数组,您可以使用 item 检索相应的 Python 对象。方法:

QL = QL.item()
k = k.item()

Numpy 应该至少发出溢出警告,但显然这对某些操作失败了:https://github.com/numpy/numpy/issues/8987

长话短说

在您的例子中,kint32 类型的 numpy 标量。您可以执行以下任一操作:

对于 numpy 64 位结果:

k = np.int64(k)

对于无限精度的 Python 结果:

k = k.item()

如果您不想显式转换每个 k,您可以使用正确的类型创建范围:

k = np.arange(10, dtype=np.int64)[4]

没有明确指定的情况下,没有可靠的方法为所有新数组设置默认整数类型。

关于python - 确保计算完成 64 位(或至少警告溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61915563/

相关文章:

python - setuptools 如何决定为 sdist/bdist 保留哪些文件?

python-2.7 - 我无法使用 python 安装 numpy 和 scipy

python - 将numpy对象类型转换为float类型

python-3.x - 如何安全地将 float64 舍入并固定到 int64?

python - 使用正则表达式查找格式为 '[number]' 的字符串

python - psycopg2 + 存储过程 + 复合类型

python - 根据字符串列的最后一个字母,使用掩码删除 Pandas df 行

python - Numba nopython 模式的三对角矩阵算法

c - 数组索引上的整数溢出

c - 检测 uint64_t 整数乘法溢出 C