将结果存储在 int32 中时,从 2**31 中减去 1 但不从 numpy.power(2,31) 中减去 1 时出现 Numpy 溢出警告

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

这可能有点具体,但我想更详细地了解 Numpy 的这种行为(numpy 版本 1.26.3)。

我在编写简单的帕克和米勒随机数生成器时遇到了这个问题。它涉及用 2^31-1 计算模数,并且恰好像这样定义它:

m = numpy.power(2,31)-1

并收到警告

RuntimeWarning: overflow encountered in scalar subtract m = numpy.power(2,31)-1
。一开始我有点惊讶,但我很快意识到 numpy 默认使用 int32,即使在 64 位机器上也是如此。但这让我想知道为什么上电时没有出现错误,导致有符号 32 位整数溢出。结果还是正确的:

print(type(m),m)

<class 'numpy.int32'> 2147483647

直接将 2147483648 存储到 m 会出现溢出错误

OverflowError: Python int too large to convert to C long

效果很好;我现在收到警告,说我正在存储 2^31-1。如果我存储的是 2^31,我会在没有警告的情况下得到错误的答案:

test = np.power(2,31)
print(type(test),test)

<class 'numpy.int32'> -2147483648

而不是正确答案,

2147483648
。是否有关于何时使用 Numpy 仔细检查此类行为的指南?

python numpy warnings
1个回答
0
投票

简短回答:NumPy 使用默认的整数数据类型,即“numpy.int32”,其范围有限

更具描述性的答案:

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