最小的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)比较粒子位置有没有更快/更强大的实现?
答
但是,该算法有时会将相同的坐标放入列表两次。为了避免...
是的,我的意思是相同的坐标(相同的粒子=相同的位置)。不只是两个非常接近的双变量。
为了避免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)
就足够了。
更深层的问题是为什么“两次同样坐标到列表中”是一个问题?海事组织,这个限制是问题。使用不需要限制的算法。
如果您正在根据确切位置将某些东西放入列表中,那么您使用的是整数概念。这基本上是你在用epsilons做的事情 - 削减了额外的精度,把双重比较变成了一个整数比较。如果你想看到重叠,我假设他们有几何边界。检查是否有碰撞。 –
'x1'和'x2'可以是'1e + 300'或'1e-300'。那他们的区别是什么? –
'fabs(x1-x2)
chux