为何自定义泰勒公式正弦函数输出无法按指定精度显示小数?
问题分析与解决办法
嘿,我帮你找出了两个导致输出精度不符合预期的关键问题,咱们一步步来解决:
1. 打印格式字符串写错了
你现在用的打印语句:
print("{0:}{1:{2}f}".format("sin= ", sinAns(rad), precision))
这里的动态精度写法有问题,要让Python识别precision作为小数位数的参数,得在精度前加个.,正确的写法应该是:
print("{0:}{1:.{2}f}".format("sin= ", sinAns(rad), precision))
之前少了这个.,Python没法正确解析你要的精度,所以默认只显示6位小数,这就是为啥不管你把precision设成2到10之间的啥值,输出都是0.500000的原因。
2. 泰勒级数的循环终止逻辑有问题
你当前用abs(tDiff)>.5*10**(-pr)作为终止条件,其中tDiff是相邻两项的绝对值差。但泰勒级数的收敛判断应该看当前项的绝对值是否足够小,而不是两项的差值——有时候差值满足条件了,但当前项还没小到符合精度要求,反过来也可能差值没满足,但当前项已经达标了。
我给你简化并修正了sinAns函数,逻辑更清晰,也能正确终止循环:
def sinAns(rad, precision=10): pr = precision + 1 threshold = 0.5 * 10 ** (-pr) # 泰勒级数第一项:rad^1/1! current_term = rad sin_sum = current_term n = 1 # 用来计算下一项的分母系数 while abs(current_term) > threshold: # 递推计算下一项:前一项乘以 (-rad²),再除以((2n+1)*(2n)) current_term *= (-rad * rad) / ((2 * n + 1) * (2 * n)) sin_sum += current_term n += 1 return sin_sum
这个版本做了这些优化:
- 直接用当前项的绝对值和阈值对比,确保每一项都小到符合精度要求才停止循环
- 删掉了冗余的占位变量,代码更简洁
- 把
precision作为函数参数传入,模块化更好
额外小提示
- 角度转弧度的时候,记得用
弧度 = 角度 * π / 180,因为不能调用math模块,你可以手动定义一个足够精确的π值,比如PI = 3.141592653589793 - 测试的时候可以用已知值验证,比如输入30度(对应π/6弧度),sin值应该接近0.5,当
precision设为10时,输出会是0.5000000000
内容的提问来源于stack exchange,提问作者user12681585
相关产品推荐
相关产品推荐

