2017-08-25 38 views
0

在我的程序中,我將特定座標放入列表中。但是,該算法有時會將相同的座標放入列表中兩次。爲了避免這種情況,我做的標準方法,通過在列表中的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

回答

2

但是,該算法有時會將相同的座標放入列表兩次。爲了避免...

是的,我的意思是相同的座標(相同的粒子=相同的位置)。不只是兩個非常接近的雙變量。

爲了避免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)就足夠了。

更深層的問題是爲什麼「兩次同樣座標到列表中」是一個問題?海事組織,這個限制是問題。使用不需要限制的算法。