请确保计算完成了64位(或至少要说其他警告)

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

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

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

哪里

QL=200003, k=4

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

一个最小的工作示例可以是以下内容:

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

((这里返回我406556672而不是好的答案230592040000000000,这里的数字不是负数,但仍然会出现相同的问题。)

我的问题是:

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

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

此外,如果数字错误,我很高兴在这里发现了此错误,但是肯定的是,我无法迅速找到错误。

至少在此类情况发生时如何迫使python警告我?

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

[用Python编写QL=200003, k=4时,数字被解释为int s。默认情况下,如果要将它们转换为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对象:

item

TL; DR

在您的情况下,QL = QL.item() k = k.item() 是类型为k的numpy标量。您可以执行以下任一操作:

对于Numpy 64位结果:

int32

对于无限精度的Python结果:

k = np.int64(k)
© www.soinside.com 2019 - 2024. All rights reserved.