这个问题在这里已有答案:
我像这段代码一样使用numpy
>>>import numpy as np >>>a=np.arange(1,100000001).sum() >>>a 987459712
我猜结果必须是5000000050000000
我注意到,直到五个数字,结果还可以 . 有人知道发生了什么事吗?
问候
Numpy在这里没有犯错 . 这种现象称为integer overflow .
x = np.arange(1,100000001) print(x.sum()) # 987459712 print(x.dtype) # dtype('int32')
arange 中用于给定输入的32位整数类型根本无法容纳5000000050000000.最多可能需要2147483647 .
arange
如果显式使用更大的整数或浮点数据类型,则会得到预期的结果 .
a = np.arange(1, 100000001, dtype='int64').sum() print(a) # 5000000050000000 a = np.arange(1.0, 100000001.0).sum() print(a) # 5000000050000000.0
我怀疑你使用的是Windows,其结果的数据类型是32位整数(而对于那些使用,例如,Mac OS X或Linux,数据类型是64位) . 请注意 5000000050000000 % (2**32) = 987459712
5000000050000000 % (2**32) = 987459712
尝试使用
a = np.arange(1, 100000001, dtype=np.int64).sum()
要么
a = np.arange(1, 100000001).sum(dtype=np.int64)
附:任何不使用Windows的人都可以按如下方式重现结果:
>>> np.arange(1, 100000001).sum(dtype=np.int32) 987459712
2 回答
Numpy在这里没有犯错 . 这种现象称为integer overflow .
arange
中用于给定输入的32位整数类型根本无法容纳5000000050000000.最多可能需要2147483647 .如果显式使用更大的整数或浮点数据类型,则会得到预期的结果 .
我怀疑你使用的是Windows,其结果的数据类型是32位整数(而对于那些使用,例如,Mac OS X或Linux,数据类型是64位) . 请注意
5000000050000000 % (2**32) = 987459712
尝试使用
要么
附:任何不使用Windows的人都可以按如下方式重现结果: