在我的程序中,我将特定坐标放入列表中。但是,算法有时会将相同的坐标放入列表中两次。为了避免这种情况,我通过将EPSILON值与列表中所有位置的x和y值的绝对差值进行比较来进行标准方法:
<input type="number" step="0.01" id="change">
我有几个问题:
1)这个实现比较两个粒子的位置是否正确?
2)我可以选择EPSILON多小? (粒子可以非常接近)
3)是否有更快/更强大的实现来比较粒子的位置?
答案 0 :(得分: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,这个限制就是问题所在。使用不需要该限制的算法。