为何使用np.arange参数与int字面量调用函数时计算结果不同?
问题根源:整数溢出
你遇到的问题核心是numpy整数溢出。np.arange(46000, 47000, 100)默认生成int32类型数组,而46400**2 = 2152960000,这个值超过了int32的最大值(2147483647),导致整数溢出,计算结果变成负数,最终整个函数输出错误的-298左右的值。而直接调用f(46400)时,Python用的是任意精度的原生整数,不会出现溢出,所以结果正确。
解决方法
有几种简单的修复方式:
生成数组时指定浮点类型:
import numpy as np f = lambda a: 6.91581104e-08 * (a**2) + (-6.00953365e-03) * a + 1.28878592e+02 arr = np.arange(46000, 47000, 100, dtype=np.float64) result_dict = {x: f(x) for x in arr}这样数组元素是浮点型,计算时不会溢出。
在函数内部把参数转为浮点型:
f = lambda a: 6.91581104e-08 * (float(a)**2) + (-6.00953365e-03) * float(a) + 1.28878592e+02 arr = np.arange(46000, 47000, 100) result_dict = {x: f(x) for x in arr}强制转换后,计算用的是浮点运算,避免整数溢出。
改用
np.linspace生成浮点数组(效果和指定dtype类似):arr = np.linspace(46000, 46900, 10, dtype=np.float64)这里10是因为46000到46900步长100共10个值,和原
arange结果一致。
内容的提问来源于stack exchange,提问作者Juin ss
相关产品推荐
相关产品推荐

