[英]Compare doubles in c++
我想确定一个点是否在圆圈内。 所以我这样做:
(x - center_x)^2 + (y - center_y)^2 < radius^2
但我的坐标是double
,我想我应该用epsilon做,所以是fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2 ) < EPS
更好?
当您使用<
或>
进行比较时,您不需要epsilon,这些都非常好。 你需要它而不是==
。 在你的情况下,你刚刚添加了一小部分半径,这可能是不可取的。 另请注意, ^
与pow(a, b)
。
你不能在C ++中使用'^'来达到这个目的。 代替(x - center_x)^2 + (y - center_y)^2 < radius^2
do (x - center_x)*(x - center_x) + (y - center_y)*(y - center_y) < radius*radius
。 坐标加倍是没有问题的。
这取决于。
Naiive有序不等式比较通常最适合测试浮点值是否在阈值的一侧。
由于浮点错误,应该在阈值的一侧的结果可能最终在另一侧。 如果重要的是保证不会出现假阴性,同时增加误报的可能性,那么您建议的替代方案可能是合适的。
请注意,当输入值的大小不同时,基于恒定epsilon的误差补偿无效。
不。正如其他人所提到的,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) 位于圆的圆周上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.