从上两节的叙述可知,在浮点计算中两个数据相等的含义通常是指在误差范围内,两个数据的意义一致(即二者描述的物理量的取值一致,或者说相容),不是==操作符的语义,因此不能使用==操作符进行判断。
在编程中,浮点数的相等判断通常有下列形式:
| V V0 | < Δ |
代码举例:
if( abs( v v0 ) < DELTA ) |
问题的关键在于确定Δ。
Δ值的确定来自数值背后的含义,而且总是与误差的概念相随。
(1)依据数据误差进行判断
如果两个数据相差Δ,假设一个数据的误差是Δ1,另一个数据的误差是Δ2,那么一个简单的判据是:
| V V0 | < Δ1 + Δ2 |
实际上,如果数据不是直接来自某个测量设备,而是某个仿真系统的输出或者是测量数据经过一系列处理的结果,那么Δ1和Δ2大多没有确定的值。此外,这种方法在理论上也不够严谨,只是便于使用而已。
(2)依据允许误差进行判断
在许多情况下,计算精度和数据精度均远远超过了实际需求,使用数据误差进行相等判断除了加大计算量,没有实际意义。此时,根据实际精度需求确定允许误差,然后用允许误差替代数据误差进行相等判断。这种方法更简单,而且允许误差一般远大于数据误差,可以减小计算量。例如判断弹头是否落地一般使用高程参数:
| H H0 | < ΔH |
其中,H是弹头的高程;H0是弹下点的地面高程;ΔH是允许误差。显然,ΔH的取值会影响弹道积分的终止时刻,从而影响落地时间和命中偏差。从计算精度而言,ΔH的取值越小越好,但ΔH越小,积分终止时就需要更多的迭代。实际上,当ΔH小到一定程度,它对积分的影响就微乎其微,没必要取更小的值增大计算量。假设导弹的命中精度是100m,那么ΔH取1.0m显然不会有什么太大影响。
不过,所谓的容许误差往往没有什么确定值,主要依据经验,因此有较大的不确定性。