繁体   English   中英

比较c ++中的双打

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM