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

使用while循环近似cos(x)时遇“需TRUE/FALSE值却缺失”错误求助

问题排查与修正

错误原因分析

你的代码报错核心原因有三点:

  1. 循环条件逻辑完全错误:你判断的是累加结果approximation是否超出±1e-10,但精度要求是指新增项的绝对值小于1e-10时停止,而非累加结果的范围。cos(π/2)的真实值是0,初始approximation=1直接满足你的循环条件,但后续逻辑会因为重复累加、项错位导致数值异常,最终触发缺失值报错。
  2. 初始项重复计算:approximation初始值已经是泰勒展开n=0的项(1),但循环中第一次计算的还是n=0的项,导致重复累加,后续所有项的计算都错位。
  3. 不必要的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:59:56