15位精度浮点计算(20-(sqrt(32397)/9))^(1/3)的误差求解
分析相近数相减后的误差计算
首先,我们一步步拆解这个问题——核心是处理相近数相减导致的灾难性抵消,先算减法步骤的误差,再通过误差传播得到最终三次方根结果的误差值。
步骤1:确定真实值与计算值
先精准推导减法部分的真实结果:
- 因为
32397 = 180² - 3,所以sqrt(32397) = 180 × sqrt(1 - 3/180²) ≈ 179.99166647376543 - 除以9后得到:
179.99166647376543 / 9 ≈ 19.999074052640603 - 真实差值:
20 - 19.999074052640603 = 0.000925947359397 - 你用15位精度计算得到的差值:
0.000925947369386
步骤2:计算减法步骤的误差
绝对误差
绝对误差是计算值与真实值的差的绝对值:
|0.000925947369386 - 0.000925947359397| ≈ 9.989 × 10⁻¹²
相对误差
相对误差是绝对误差除以真实值:
9.989 × 10⁻¹² / 0.000925947359397 ≈ 1.08 × 10⁻⁸
步骤3:将误差传播到三次方根计算
设 f(y) = y^(1/3)(y 是减法结果),根据数值分析的误差传播公式:
- 绝对误差:
Δf ≈ f’(y_true) × Δy,其中导数f’(y) = (1/3)y^(-2/3) - 相对误差:
Δf/f ≈ (1/3)(Δy/y)
最终结果的绝对误差
先计算真实差值的导数项:
y_true = 0.000925947359397 y_true^(-2/3) = (1/0.000925947359397)^(2/3) ≈ 105.27
代入绝对误差公式:
Δf ≈ (1/3) × 105.27 × 9.989 × 10⁻¹² ≈ 3.50 × 10⁻¹⁰
最终结果的相对误差
直接用相对误差传播公式简化计算:
Δf/f ≈ (1/3) × 1.08 × 10⁻⁸ ≈ 3.60 × 10⁻⁹
额外优化建议
这种灾难性抵消可以通过代数变形避免,比如把原式改写为:
( (20² - (sqrt(32397)/9)²) / (20 + sqrt(32397)/9) )^(1/3) = (1/(27*(20 + sqrt(32397)/9)))^(1/3)
这样就彻底避开了相近数相减,能保留更多有效数字。
内容的提问来源于stack exchange,提问作者John Keeper
相关产品推荐
相关产品推荐

