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

Ensure that calculations are done 64 bits (or at least warn of 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)

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

我的问题是:

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

我不想为我创建的每个号码明确指定它。

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

当您在 Python 中写入 QL = 200003; k = 4 时,这些数字将被解释为 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

TL;DR

在你的例子中,k 是一个 int32 类型的 numpy 标量。您可以执行以下任一操作:

对于 numpy 64 位结果:

k = np.int64(k)

对于无限精度 Python 结果:

k = k.item()

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

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

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