2017-04-25 7 views
4

저는 코드에서 부동 소수점 동일성 비교를 수행하는 것과 관련된 문제에 다소 익숙합니다.Wfloat-equal 옵션을 사용하여 부동 소수점을 1 또는 0으로 비교

은 현재 내가 에 컴파일하고있어 코드베이스 (GCC를 연타)은 다음과 같은 옵션을 사용할 수 있습니다 :

:

-Wfloat - 동일 그리고 코드베이스에서 다음 예제 비교가있다 다음과 같이

template <typename FloatType> 
void foo(FloatType v) { 
    if (v == FloatType(1)) { 
    ... 
    } 
    else if (v == FloatType(0)) { 
    .... 
    } 
} 

푸 기능이 호출됩니다

double d = 123.98; 
float f = 123.98f; 

foo(d); 
foo(f); 

부동 소수점에 정확한 표현을 가지고있는 1과 0의 특수한 경우 (double, float)과 코드가 명확하게 일치하고 어떤 사소한 차이가있는 것이 아닌 코드가 분명하게 나오는 곳 -

Is 코드를 다시 작성하여 관련 Wfloat-equal 진단을 제기하지 않으며 이식성이 있으며 float 및 double 유형을 모두 지원할 수 있습니까?

+1

당신은 단지 사람들을 위해 진단을 해제하는 GCC의'의 #pragma GCC 진단 푸시/팝/ignored'을 사용할 수를 포함한 시스템 헤더를 처리 할 때 지금까지 GCC에 관한 한 그것은 검사의 모두 비활성화됩니다 윤곽. –

+1

memcmp라고 할 때 언제나'memcmp'를 사용할 수 있습니다. – VTT

+0

@VTT 0과 1의 값을위한 별도의 변수가 있습니까? –

답변

2

사용 방법은 std::equal_to입니다. float-equal

template <typename FloatType> 
void foo(FloatType v) { 
    if (std::equal_to<FloatType>()(v,FloatType(1))) { 
    ... 
    } 
    else if (std::equal_to<FloatType>()(v,FloatType(0))) { 
    .... 
    } 
}