这可能有点具体,但我想更详细地了解Numpy(NumPy版本1.26.3)的这种行为.
我在编写一个简单的Park和Miller随机数生成器时遇到了这个问题.它涉及到用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的这种行为,有什么指导方针吗?