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

问题描述:

在我的程序中,我将特定坐标放入列表中。但是,该算法有时会将相同的坐标放入列表中两次。为了避免这种情况,我做的标准方法,通过在列表中的EPSILON值关闭所有位置比较x和y的值的绝对差:最小的EPSILON比较C中的双变量?

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)比较粒子位置有没有更快/更强大的实现?

+0

如果您正在根据确切位置将某些东西放入列表中,那么您使用的是整数概念。这基本上是你在用epsilons做的事情 - 削减了额外的精度,把双重比较变成了一个整数比较。如果你想看到重叠,我假设他们有几何边界。检查是否有碰撞。 –

+0

'x1'和'x2'可以是'1e + 300'或'1e-300'。那他们的区别是什么? –

+1

'fabs(x1-x2) chux

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

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

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

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

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

使用固定差(ε)才有意义在小范围内FP的值。 1e100和2e100与1e-100和2e-100类似,不同于浮点数的观点。

2)我可以选择EPSILON多小? (颗粒可以来真的彼此接近)

比较相同的烦躁,使用==

3)是否有任何更快/或更稳健的实现比较粒子的位置?

只需使用==


代码可以==比较双打,这是比较平等的,不亲近非常有用的。如果平等预防是所有需要的,那么if (x1 == x2 && y1 == y2)就足够了。

更深层的问题是为什么“两次同样坐标到列表中”是一个问题?海事组织,这个限制是问题。使用不需要限制的算法。