为什么这种针对灾难性取消的幼稚解决方案不起作用?
Why does this naive solution to catastrophic cancellation not work?
我在 wikipedia 上看到灾难性抵消是一种现象,其中 B~=A 然后 A-B 与真实差异相比将具有非常高的相对误差。
我想到了一个非常天真的解决方案:为什么不直接取:A-B~=(NA-NB)/N s.t。 N>>1?
这会使 'true difference' 大得多,因此应该大大减少近似 A-B 的相对误差,对吗?
考虑一种典型情况,其中 A
和 B
是 M*(2^EXP)
形式的浮点数。灾难性的取消发生是因为 M 只有有限的位数,并且 M_A 大约是 M_B 所以高位取消。你只剩下几个有效位了。
现在考虑 N=16 的解。这只是执行相同的计算,只是数字现在具有 M*(2^(EXP+4))
的形式。问题还是M,不是EXP.
不过,如果 EXP+4
溢出,您还有一个问题。那么结果将是 INF-INF
,即 NaN
: Not a Number
我们需要区分减去浮点数时的错误,以及减去两个由两个最接近的浮点表示近似的数字时的错误。
如果 A 和 B 是浮点数且 A/2 <= B <= 2A,则减法 A - B 是精确的。这是Sterbenz lemma。所以如果你认为 A 和 B 是浮点数表示,问题的前提是不正确的。
但是,如果你把A和B想象成任意实数,那么它们必须用浮点数a和b来近似,根据舍入模型a = A(1+δ), b = B( 1+υ), 其中 δ<=μ ν<=μ 其中 μ 是四舍五入的单位。
相对误差为|(a - b) - (A-B)|/|A - B| = |Aδ - Bν|/|A-B| <= μ|A+B|/|A-B|。如果重新调整所有这些数量,也会重新调整误差,即
|Na - Nb - (NA-NB)|/|NA - NB| = |NAδ - NBTν|/|NA-NB| = |Aδ - Bν|/|A-B|.
我在 wikipedia 上看到灾难性抵消是一种现象,其中 B~=A 然后 A-B 与真实差异相比将具有非常高的相对误差。
我想到了一个非常天真的解决方案:为什么不直接取:A-B~=(NA-NB)/N s.t。 N>>1? 这会使 'true difference' 大得多,因此应该大大减少近似 A-B 的相对误差,对吗?
考虑一种典型情况,其中 A
和 B
是 M*(2^EXP)
形式的浮点数。灾难性的取消发生是因为 M 只有有限的位数,并且 M_A 大约是 M_B 所以高位取消。你只剩下几个有效位了。
现在考虑 N=16 的解。这只是执行相同的计算,只是数字现在具有 M*(2^(EXP+4))
的形式。问题还是M,不是EXP.
不过,如果 EXP+4
溢出,您还有一个问题。那么结果将是 INF-INF
,即 NaN
: Not a Number
我们需要区分减去浮点数时的错误,以及减去两个由两个最接近的浮点表示近似的数字时的错误。
如果 A 和 B 是浮点数且 A/2 <= B <= 2A,则减法 A - B 是精确的。这是Sterbenz lemma。所以如果你认为 A 和 B 是浮点数表示,问题的前提是不正确的。
但是,如果你把A和B想象成任意实数,那么它们必须用浮点数a和b来近似,根据舍入模型a = A(1+δ), b = B( 1+υ), 其中 δ<=μ ν<=μ 其中 μ 是四舍五入的单位。
相对误差为|(a - b) - (A-B)|/|A - B| = |Aδ - Bν|/|A-B| <= μ|A+B|/|A-B|。如果重新调整所有这些数量,也会重新调整误差,即
|Na - Nb - (NA-NB)|/|NA - NB| = |NAδ - NBTν|/|NA-NB| = |Aδ - Bν|/|A-B|.