0

在我的程序中,我将特定坐标放入列表中。但是,该算法有时会将相同的坐标两次放入列表中。为了避免这种情况,我通过将 EPSILON 值与列表中所有位置的 x 和 y 值的绝对差进行比较来执行标准方法:

bool doubleEqual(double x1, double y1, double x2, double y2){
    if( (fabs(x1-x2) < EPSILON) && (fabs(y1-y2) < EPSILON) ){
        return TRUE; // particle is already in list
    }
    return FALSE; // particle is not in the list
}

我有几个问题:

1)这种比较两个粒子位置的实现是否正确?

2) 我可以选择多小的 EPSILON?(粒子可以彼此非常接近)

3)有没有更快/更健壮的实现来比较粒子的位置?

4

1 回答 1

2

但是,该算法有时会将相同的坐标两次放入列表中。为了避免这种...

是的,我的意思是相同的坐标(相同的粒子=相同的位置)。不仅仅是两个非常接近的双变量。

为了避免 XY 元素相同,一个简单的比较就足够了

bool doubleEqual(double x1, double y1, double x2, double y2){
    return (x1 == x2) && (y1 == y2);
}

1)这种比较两个粒子位置的实现是否正确?

使用固定差值 (epsilon) 仅在 FP 值的狭窄范围内有意义。从浮点的角度来看,1e100 和 2e100 与 1e-100 和 2e-100 类似地不同。

2) 我可以选择多小的 EPSILON?(粒子可以彼此非常接近)

要比较相同性,请使用==

3)有没有更快/更健壮的实现来比较粒子的位置?

只需使用==


代码可以比较双精度==数,这对于比较相等性非常有用,而不是接近性。如果只需要预防平等,那就if (x1 == x2 && y1 == y2)足够了。

更深层次的问题是为什么“同一坐标进入列表两次”是个问题?IMO,这个限制就是问题所在。使用不需要该限制的算法。

于 2017-08-27T04:31:41.923 回答