使用以下方法对前 100,000,000
个正整数求和:
import numpy as np
np.arange(1,100000001).sum()
我返回:987459712
,与公式不匹配:N(N+1)/2
for N=100000000
。即,公式返回 5000000050000000
。
在发布之前,我写了以下内容,它返回 True
:
np.arange(1,65536).sum() == ((65535+1) * 65535)/2
但是,数字 65536
似乎是一个临界点,因为
np.arange(1,65537).sum() == ((65536+1) * 65536)/2
返回 False
。
对于大于 65536
的整数,代码返回 False
,而低于此阈值的整数返回 True
。
谁能解释一下我在计算总和时做错了什么,或者代码出了什么问题?
最佳答案
似乎 numpy
有时很难猜测正确的数据类型。
在我的系统上,Win 10 64 位,Python 3.4.4,numpy 1.13.1:
>> np.arange(1, 100000001).sum()
987459712
>> np.arange(1, 100000001).dtype
dtype('int32')
但是,如果我们“帮助”numpy
,它会得到正确的结果:
>> np.arange(1, 100000001, dtype=np.int64).sum()
500000005000000
错误的结果显然是32位整数溢出造成的。
关于python - numpy 中连续整数的总和不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47225263/