2012-11-06 1 views
1

Possible Duplicate:
Most effective way for float and double comparison
How dangerous is it to compare floating point values?는 플로트 변수

비교 나는 const float M = 0.000001;float input; 있습니다. 나는 평등을 확인하고 싶지 않다. 하지만 직접 확인에는 부작용이 있다는 것을 알고 있습니다. M != input. 그래서, 내 질문에 어떻게 부작용없이 두 플로트 값을 비교할 수 있습니까? 더 정확한 비교가 엡실론의 가치

+3

"부작용"이란 무엇을 의미합니까? 수레를 비교하는 것은 일반적인 용어의 의미에서 부작용이 없습니다. –

+0

'M! = input'은 부작용이 아닙니다. –

+0

부동 소수점 비교에 대한 훌륭한 기사는 [부동 소수점 비교] (http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)에서 찾을 수 있습니다. 기본적으로 요구 사항에 따라 다음과 같이 사용할 수 있습니다 - 엡실론 - 절대 오류 : 값의 범위는 미리 알려져 있습니다 - 엡실론 - 상대 오차 : 값의 범위는 미리 알 수 없습니다. 속도 표현이 본질 일 때 정수 표현을 사용하십시오. – Alex

답변

3
const double epsilon = 1e-12; 

if(fabs(input - M) < epsilon) //input == M 
{ 
    //... 
} 
if(fabs(input - M) >= epsilon) // input != M 
{ 
    //... 
} 

작은, 따라서 더 확률이 두 개의 값은 당신이 그 (것)가 동일한 것으로 간주 할 싶어 반면 같지 않은 것을 당신에게 말할 것이다. 엡실론의 가치가 클수록, 실제로 당신이 평등하지 않기를 바랄 때 결과가 똑같을 것이라고 말하는 확률이 더 높아집니다. 엡실론의 가치는 당면 과제의 세부 사항에 따라 선택되어야합니다.

+0

'! ='어떻게 할 수 있습니까? – user1802858

+0

''엡실론 '의 실제 값은 응용 프로그램에 따라 다르다는 것을 지적 해두면 유용 할 정도로 "동등한"값을 입력해야합니다. – unwind

+0

@ user1802858 비교 연산자를'> ='으로 바꿉니다. – unwind

0

부동 소수점을 비교할 때 "동등"대신 "닫기"를 비교해야합니다. 필요한 것을 기반으로 "닫기"를 정의하는 여러 가지 방법이 있습니다. 그런 다음

namespace FloatCmp { 

const float Eps = 1e-6f; 

bool eq(float a, float b, float eps = Eps) { 
    return fabs(a - b) < eps; 
} 

//etc. for neq, lt, gt, ... 

} 

수레를 비교하는 FloatCmp::eq() 대신 ==의를 사용하지만, 일반적인 접근 방식은 같은 것을 할 수 있습니다.