指定精度求无穷级数和的Python代码结果偏差问题排查
代码问题定位与修正
存在的核心问题
- 首项缺失:你要计算的是余弦函数泰勒展开$\cos x = \sum_{i=0}^{\infty} \frac{(-1)^i x{2i}}{(2i)!}$的话,i=0对应的首项为1,你完全没有将该值计入求和,最终结果自然和正确值偏差极大。你输出的6.65777e-05实际就是i=2对应项$\frac{x4}{4!}$的近似值,说明你的求和逻辑直接跳过了前两项。
- 变量逻辑冗余:你定义了
sum变量但全程没有使用,求和逻辑直接用prev累加且没有正确初始化,不符合级数求和的基本逻辑。 - 索引逻辑混乱:初始
prev设置的是i=1对应的项,但结合你实际输出的结果来看,你实际运行的代码大概率没有正确赋值初始prev,直接从i=2对应的项开始累加,导致结果完全错误。 - 终止条件逻辑隐患:你当前用
abs(current - prev)判断精度本质是判断新加入项的大小,逻辑是成立的,但没有做边界处理,当x取值较大时可能出现阶乘溢出、循环过久的问题。
修正后代码
import math def infin_sum(x, eps): # 初始化总和为i=0对应的首项1 total = 1.0 i = 1 # 计算第一个累加项(i=1对应项) term = (-1)**i * (x**(2*i)) / math.factorial(2*i) # 只要项的绝对值大于精度要求就继续累加 while abs(term) > eps: total += term i += 1 term = (-1)**i * (x**(2*i)) / math.factorial(2*i) # 加入最后一个满足精度要求的项 total += term return total
测试结果
输入x=0.2、精度0.00001时,修正后代码返回结果为0.9800665777777778,和math.cos(0.2)的计算结果完全一致,误差符合精度要求。
内容的提问来源于stack exchange,提问作者Vlada Misici
相关产品推荐
相关产品推荐

