为何用Numpy计算1至1500000的和得负数,for循环结果正常?
问题原因解析
这是整数溢出导致的:
- Numpy的
np.arange()默认生成int32类型的数组,而int32能存储的最大值是2^31-1 = 2147483647。 - 你计算的1到1499999的和是
(1499999 * 1500000) / 2 = 1124999250000,这个数值远超int32的上限,触发溢出后数值会绕回成负数。 - 而Python原生的
int是动态扩容的任意精度整数,不存在溢出限制,所以for循环能得到正确结果。
验证与解决方法
手动指定numpy数组为更高精度的整数类型(比如int64),就能得到正确结果:
import numpy as np import time start = time.time() print('sum is: ', np.sum(np.arange(1500000, dtype=np.int64))) end = time.time() print("duration: ", end - start) # 输出结果:sum is: 1124999250000
内容的提问来源于stack exchange,提问作者Mimo
相关产品推荐
相关产品推荐

