这可能有点具体,但我想更详细地了解 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 仔细检查此类行为的指南?