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

小δ下$y :=cos(x+δ)-cos(x)$的计算难点及等价表达式求解

嘿,这个数值计算里的经典坑我太熟了!咱们一步步来拆解问题:

为什么δ极小时直接计算cos(x+δ)-cos(x)会出大问题?

核心问题就是舍入抵消误差:当δ趋近于0时,x+δ和x几乎重合,对应的cos(x+δ)和cos(x)的值也会非常接近——甚至接近到在浮点数的存储精度里,高位的有效数字完全一样。

举个实际的例子:用双精度浮点数(64位,约15-17位有效数字)计算,假设x=1,δ=1e-15,cos(1)≈0.5403023058681398,cos(1+1e-15)≈0.5403023058681397。直接相减的话,高位的15位有效数字都抵消了,只剩下最后一位的差异,而这最后一位本身就可能是浮点数舍入带来的噪声,结果的精度直接暴跌到几乎不可用。

这种相近数相减的情况,是数值计算里最容易触发精度丢失的场景之一。

完全等价的无误差问题表达式

解决这个问题的关键是用三角恒等式把减法转换成乘法,从根源上避免舍入抵消。回忆余弦的差化积公式:

cos(A) - cos(B) = -2·sin((A+B)/2)·sin((A-B)/2)

把A = x+δ,B = x代入进去,就能得到严格等价的表达式:

cos(x+δ) - cos(x) = -2·sin(x + δ/2)·sin(δ/2)

为什么这个表达式就没问题?

  • 当δ极小时,sin(δ/2)是一个明确的小数值(小角度下甚至可以近似为δ/2,但恒等式本身是精确的),不需要和任何相近数相减;
  • sin(x + δ/2)和sin(x)虽然接近,但这里是乘法操作,乘法只会缩放数值,不会像减法那样直接抵消高位有效数字,自然也就不会触发舍入抵消的问题。

还是用刚才的例子验证:x=1,δ=1e-15,sin(x+δ/2)=sin(1+5e-16)≈0.8414709848078965,sin(δ/2)=sin(5e-16)≈5e-16,计算结果为-2×0.8414709848078965×5e-16≈-8.414709848078965e-16,这个结果的精度完全符合浮点数的存储能力,没有任何不必要的误差。

额外小提示

如果δ小到极致,你还可以用小角度近似sin(δ/2)≈δ/2,把表达式简化为-sin(x)·δ——这是一个近似式,适合对精度要求稍低或者需要更快计算的场景;但如果要严格精确,一定要用前面的差化积恒等式版本。

内容的提问来源于stack exchange,提问作者SuperMathBrothers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:35:05