2010-02-28 3 views
2

부동 소수점 숫자를 반올림하여 정밀도를 설정하고 함수에서 결과를 반환하고 싶습니다. 예를 들어, 나는 현재 다음과 같은 기능을 가지고 : 내가 무엇을하고자하는 대신 직접 v[i] == point.v[i] 비교를하는 것입니다C++ 부동 소수점을 설정하여 정밀도를 설정하십시오.

inline bool R3Point:: 
operator==(const R3Point& point) const 
{ 
    // Return whether point is equal 
    return ((v[0] == point.v[0]) && (v[1] == point.v[1]) && (v[2] == point.v[2])); 
} 

, 내가 특정 세트의 정밀도로 숫자 만 비교하는 소원 그렇다면 v[i] = 0.33349999999999996point.v[i] = 0.33350000000000002 그, 내 동등 비교 결과는 TRUE가됩니다.

나는 C++ smanip setprecision (int n); 기능이 있다는 것을 알고 있고, cout을 사용하여 화면에 출력을 표시 할 때 많이 사용되는 것을 보았습니다. 그러나, 내가 설명한 것처럼 함수 내에서 사용할 수 있는지 확실하지 않습니다.

감사합니다.

답변

5

일반적으로, ==가 복식을 비교하는 데 사용되어서는 안된다, 당신은 같은 것을 수행해야합니다 당신은 기호의 확실하지 않은 경우 당신은 abs 또는 fabs을 사용할 수 있습니다

if(v[0] - point.v[0] < 1e-9) { } 

을하고 그에 따라 정밀 1E-9 변경 .

+0

그에 따라 정밀도 1e-9를 변경하면 무엇을 의미합니까? 필자의 경우에는 서명이 확실하지 않기 때문에 (fabs (v [0] -point.v [0]) <1e-9) if something을 사용할 것입니다. – Myx

+0

나는 1e-9를 정확한 자리 수에 따라 바꿔야한다는 것을 의미했다. –

3

부동 소수점 수 (예 : a와 b)를 비교할 때 abs (a-b) < 정밀도를 사용하는 것이 가장 좋습니다. 여기서 abs (x)는 절대 값 함수이고 precision은 작은 양수입니다. 자주 비교되는 숫자의 절대 값의 함수로 정밀도를 설정하려고합니다.

+2

그냥 abs 대신 std :: abs를 쓰십시오. 실수로 정수 만하는 C 함수를 가져올 수 있습니다. 해피 디버깅 ... – Tronic

관련 문제