在 C 中比较双变量的最小 EPSILON?

Smallest EPSILON to comparing double variables in C?

在我的程序中,我将特定坐标放入列表中。但是,该算法有时会将相同的坐标两次放入列表中。为了避免这种情况,我通过将 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) 是否有任何更快/或更稳健的实现来比较粒子的位置?

However, the algorithm sometimes puts the same coordinates into the list twice. In order to avoid that ...

yes, I mean the same coordinates (same particles = same position). Not just two double variables which are very close to each other.

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

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

1) Is this implementation to compare the position of two particles even correct?

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

2) How small can I choose EPSILON? (The particles can come really close to each other)

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

3) Is there any faster / or more robust implementation to compare the position of particles?

只需使用==


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

更深层次的问题是为什么"same coordinates into the list twice"有问题? IMO,这个限制就是问题所在。使用不需要该限制的算法。