确保计算是64位的(或至少警告溢出)。

问题描述 投票:3回答:1

我正在使用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在发生这种事情时警告我?

python numpy integer-overflow
1个回答
3
投票

当你写 QL = 200003; k = 4 在Python中,数字被解释为 ints. 默认情况下,如果你要把这些数组转换成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 方法。

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

Numpy至少应该发出溢出警告,但显然这对某些操作是失败的。https:/github.comnumpynumpyissues8987

TL;DR

在你的情况下。k 是一个numpy标量,类型为 int32. 你可以做以下任何一种。

对于一个numpy 64位的结果

k = np.int64(k)

对于一个无限精度的 Python 结果。

k = k.item()

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

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

没有可靠的方法来设置所有新数组的默认整数类型 而不明确地指定它.

© www.soinside.com 2019 - 2024. All rights reserved.