You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历np.arange从i=10起结果异常,请问原因是什么?

问题

运行以下Python代码时,使用zip同时遍历np.arange(20)和range(20),将得到的i、j传入pyas函数计算,发现从i=10开始,pyas(i,10)与pyas(j,10)的结果出现明显差异,输出结果如下,请问该差异产生的原因是什么?

代码

import numpy as np
from math import pi, sqrt, exp, factorial

def pyas(x, sred):
    return sred**x*exp(-sred)/factorial(x)

for i, j in zip(np.arange(20), range(20)):
    print(i, j, pyas(i,10), pyas(j,10))

输出

0 0 4.5399929762484854e-05 4.5399929762484854e-05
1 1 0.00045399929762484856 0.00045399929762484856
2 2 0.0022699964881242427 0.0022699964881242427
3 3 0.007566654960414142 0.007566654960414142
4 4 0.018916637401035354 0.018916637401035354
5 5 0.03783327480207071 0.03783327480207071
6 6 0.06305545800345118 0.06305545800345118
7 7 0.09007922571921599 0.09007922571921599
8 8 0.11259903214901998 0.11259903214901998
9 9 0.1251100357211333 0.1251100357211333
10 10 0.01764133335640144 0.1251100357211333
11 11 0.001382752728810601 0.11373639611012118
12 12 -6.89413134691794e-05 0.09478033009176766
13 13 9.595669338819968e-06 0.07290794622443666
14 14 1.4396571374678832e-07 0.05207710444602619
15 15 -5.313583114618023e-08 0.03471806963068413
16 16 4.0683489446471356e-09 0.021698793519177577
17 17 2.0030859032126935e-10 0.012763996187751515
18 18 -1.0541774694098002e-11 0.007091108993195286
19 19 -7.394475413970681e-13 0.0037321626279975192
原因分析

核心问题是数据类型不匹配导致的整数溢出:

  • range(20)生成的j是Python内置的int类型,支持任意精度整数运算,不会出现溢出,因此10**j的计算结果始终准确。
  • np.arange(20)生成的i是NumPy默认的int64类型(多数平台下),该类型的数值上限为9223372036854775807。当i≥10时,10**i的结果会超过这个上限,触发整数溢出,导致数值变成错误的负数或极小值,最终整个pyas函数的计算结果完全偏离预期。

可以通过简单代码验证溢出情况:

import numpy as np
print(np.int64(10)**10)  # 输出10000000000,未超出int64范围
print(np.int64(10)**11)  # 输出-2147483648,已发生溢出

如果要让NumPy数组的计算正常运行,可将np.arange(20)改为浮点类型,比如np.arange(20, dtype=np.float64),这样幂运算会以浮点数进行,避免整数溢出问题。


内容的提问来源于stack exchange,提问作者Александр Евстратенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:50:34