使用while循环近似cos(x)时遇“需TRUE/FALSE值却缺失”错误求助
问题排查与修正
错误原因分析
你的代码报错核心原因有三点:
- 循环条件逻辑完全错误:你判断的是累加结果
approximation是否超出±1e-10,但精度要求是指新增项的绝对值小于1e-10时停止,而非累加结果的范围。cos(π/2)的真实值是0,初始approximation=1直接满足你的循环条件,但后续逻辑会因为重复累加、项错位导致数值异常,最终触发缺失值报错。 - 初始项重复计算:
approximation初始值已经是泰勒展开n=0的项(1),但循环中第一次计算的还是n=0的项,导致重复累加,后续所有项的计算都错位。 - 不必要的
c()函数:term计算里的c()会把单个数值转为向量,累加时可能引发维度问题,甚至在迭代中产生NA,导致循环条件判断时出现缺失值,触发missing value where TRUE/FALSE needed报错。
修正后的代码
x <- pi/2 n <- 1 # 从n=1开始,n=0的项已作为初始值 approximation <- 1 # 对应泰勒展开n=0的项:((-1)^0 * x^0)/0! = 1 limit <- 1e-10 # 先计算第一个待添加的项 term <- ((-1)^n * x^(2*n)) / factorial(2*n) # 循环终止条件:当前项的绝对值小于精度要求时停止 while(abs(term) >= limit) { approximation <- approximation + term n <- n + 1 term <- ((-1)^n * x^(2*n)) / factorial(2*n) } approximation
修正说明
- 调整循环条件:改为判断当前新增项
term的绝对值是否≥1e-10,确保只有当项的大小会影响精度时才继续累加。 - 修正n的初始值:从1开始,避免重复累加n=0的项,保证泰勒展开项的顺序正确。
- 移除冗余的
c()函数:让term保持单个数值类型,避免向量操作带来的异常。 - 前置项计算:进入循环前先算出第一个待添加的项,确保第一次循环判断的逻辑合理。
内容的提问来源于stack exchange,提问作者user23327933
相关产品推荐
相关产品推荐

