2016-06-28 2 views
4

포인트가 원 안에 있는지 여부를 결정하고 싶습니다. 그래서 fabs ((x - center_x)^2 + (y - center_y)^2 - radius^2) < EPS 더 나은,C++에서 double을 비교하십시오

(x - center_x)^2 + (y - center_y)^2 < radius^2

하지만 내 좌표는 double하고 내가 엡실론 함께 할해야한다고 생각 : 그래서 이렇게?

+2

관련 항목 : http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison – NathanOliver

+2

'^ 2'이 (가) 두 번째로 뭔가를 제기한다는 인상을 받고있는 것처럼 보입니다. 힘. 그건 사실이 아니야. C++에서'^'는 "bitwise XOR"입니다 - http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators –

답변

5

< 또는 >을 사용하여 비교할 때 엡실론이 필요하지는 않지만 완벽합니다. == 대신 필요합니다. 귀하의 경우 반경에 약간의 양을 추가 했으므로 바람직하지 않을 수 있습니다. 또한 ^pow(a, b)과 같지 않습니다.

+0

고마워, 나는'=='와 함께'EPS '를 사용해야한다는 것을 알았지 만 항상'<' and '>'에 대해 궁금해했다. 이것은 나에게 분명했다! 추신 : 나는 pow로'^'를 사용할 수 없다는 것을 알고있다 : P – Gigata

+0

두 경우 모두'pow (x, 2) + pow (y, 2)'보다'x * x + y * y '를 사용하는 것이 더 좋다. 복잡한 대수 계산을 피하는 곱셈 만합니다. –

4

이 목적으로 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. 좌표가 double 일 때 아무런 문제가 없습니다.

+3

저는 이것이 코드가 아니라 OP가 사용하는 수식이라고 생각합니다. – NathanOliver

+0

@ NathanOliver, 두 경우 모두, SO 규칙은 완전한 테스트 가능한 코드를 게시하는 것이 좋습니다. 따라서 Shiro는 OP가 자신이 게시 한 수식을 사용하려고한다고 가정합니다. –

4

에 따라 다릅니다.

부동 소수점 값이 임계 값의 한쪽에 있는지 여부를 테스트 할 때 Naiive ordered inequality 비교가 일반적으로 가장 적합합니다.

부동 소수점 오류로 인해 임계 값의 한쪽에 있어야하는 결과가 다른 쪽에서 종료 될 수 있습니다. 가양 성을 보장하면서도 위양성 (false positive)의 가능성을 높이는 것이 중요하다면, 제시된 대안이 적절할 수 있습니다.

입력 값의 크기가 다를 때 일정한 엡실론 기반 오류 보상은 효과가 없습니다.

4

아니요. 언급 된 다른 항목과 마찬가지로 연산자 ^은 비트 제외 또는 전원이 아닙니다.

fabs (Sqr(x - center_x) + Sqr(y - center_y) - Sqr(radius)) < EPS 

은 (x, y)가 원주 원의에서 것을 의미합니다, 귀하의 질문에 관해서는

inline double Sqr(double x) {return x*x;} 
// ... 
if (Sqr(x - center_x) + Sqr(y - center_y) < Sqr(radius)) // ... 

:하지만 당신은 인라인 함수를 사용할 수 있습니다.