我想確定一個點是否在一個圓圈內。 所以我這樣做:比較C++中的雙打
(x - center_x)^2 + (y - center_y)^2 < radius^2
但我的座標是double
,我想我應該用小量做,所以是 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2) < EPS
更好?
我想確定一個點是否在一個圓圈內。 所以我這樣做:比較C++中的雙打
(x - center_x)^2 + (y - center_y)^2 < radius^2
但我的座標是double
,我想我應該用小量做,所以是 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2) < EPS
更好?
當您使用<
或>
進行比較時,您不需要epsilon,這些都是非常好的。您需要它而不是==
。就你而言,你剛剛添加了一小部分到半徑,這可能是不可取的。 另請注意,^
與pow(a, b)
不一樣。
謝謝,我知道我應該用'=='用'==',但總是想知道'<' and '>'。這讓我很清楚! PS我知道我不能使用'^'作爲戰俘:P – Gigata
無論哪種情況比'pow(x,2)+ pow(y,2)'都更好地執行'x * x + y * y',只有避免複雜對數計算的多目標。 –
您不能在C++中使用'^'來達到此目的。 而不是(x - center_x)^2 + (y - center_y)^2 < radius^2
做(x - center_x)*(x - center_x) + (y - center_y)*(y - center_y) < radius*radius
。 座標是雙倍的沒有問題。
我真的不認爲這是代碼,而是OP使用的公式。 – NathanOliver
@NathanOliver,無論是哪種情況,SO規則都建議發佈完整的可測試代碼,所以Shiro正確地假設OP正在嘗試使用他發佈的公式。 –
這取決於。
Naiive排序不等比較通常最適合測試浮點值是否位於閾值的一側。
由於浮點錯誤,應該在閾值一側的結果可能會在另一側結束。如果確保不出現假陰性很重要,同時增加誤報的可能性,那麼您建議的替代方案可能適用。
請注意,當輸入值幅度變化時,基於恆定ε的誤差補償無效。
否如其他人提到的,C中的運營商^
是按位獨佔的,而非權力。但是你可以使用內聯函數:
inline double Sqr(double x) {return x*x;}
// ...
if (Sqr(x - center_x) + Sqr(y - center_y) < Sqr(radius)) // ...
至於你的問題,
fabs (Sqr(x - center_x) + Sqr(y - center_y) - Sqr(radius)) < EPS
意味着(X,Y)是圓周處圈。
相關:http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison – NathanOliver
你似乎是的印象是'^ 2'提高一些東西到第二下功率。事實並非如此。在C++中'^'是「按位異或」 - http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators –