我想确定一个点是否在一个圆圈内。 所以我这样做:比较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 –