2013-09-06 4 views
1

부동 소수점을 다음 함수와 비교하는 데 사용됩니다. 그러나 C++ 11이 isgreaterequal과 같은 부동 소수점 비교 함수를 제공하는지 확인합니다. 제 질문은 표준의 기능으로 대체해야하는지 여부입니다.C++에서 부동 소수점 비교 11

bool isEqual(double lhs, double rhs, double epsilon = /std::numeric_limits<double>::epsilon()) 
{ 
    if (lhs == rhs) 
    { 
     return true; 
    } 

    return fabs(lhs - rhs) <= ((fabs(lhs) > fabs(rhs) ? fabs(rhs) : fabs(lhs)) * epsilon); 
} 
+1

어쨌든 부동 소수점 수를 비교하는 적절한 방법이 아닙니다. 첫째, 가양 성 (false positive)이 증가하지 않으면 서 위양성을 감소시킵니다. 둘째, 이전 계산에 대한 특정 지식이 없으면 오류가 왼쪽에 비례 할 것으로 예상 할 이유가 없습니다. 셋째, 단일 엡실론은 가장 단순한 계산 이외에는 드문 경우입니다. 넷째, 오류 허용 오차에는 엄청난 불연속성이 있습니다. 'lhs'가'rhs '아래로 떨어지면, 허용 오차는'rhs * ε'에서'rhs'로 점프하여 약 2 ** 52로 증가합니다. –

+0

@EricPostpischil 1. 이는 유한 정밀도 산술입니다. 2-3. 그러므로'엡실론 '은 가변적 인 주장이다. 4. 괄호를 확인하십시오. 'lhs' 또는'rhs' 중 작은 것에'epsilon'을 곱합니다. – Potatoswatter

+1

@Potatoswatter : 당신은 4에 대해 정확합니다. 1 : 정밀도가 유한하다는 사실이이 문제를 해결하지 못합니다. 다른 방법이 사용되어야합니다. 2 : 기본값이 아닌 엡실론 값을 전달해도 비교되는 값에 비례하도록 곱해진다는 사실은 변하지 않습니다. 3 : 기본값이 너무 작습니다. –

답변

1

에 따르면 중 하나를 인수 NaN을 경우 cplusplus.com

isgreaterequal를 사용하여 한 비교가 false로 평가합니다.

>=을 사용하면 인수가 NaN이면 FE_INVALID 예외가 발생합니다.

그래서 여러분의 주장 중 하나가 NaN인지 알고 싶으 실 것이므로 여러분의 기능을 그대로 유지해야한다고 생각합니다.

From C11 Draft N1570:
p.516 섹션 F.9.3 관계 연산자

X <의 Y →의 isless (X, Y) (및 유사 대 ≤,>, ≥) 수치 동일 이러한 표현은 비록 부작용으로 인해 같지 않음 x 또는 y가 NaN이고 FENV_ACCESS pragma의 상태가 인 경우 'on' '. FENV_ACCESS pragma가 "off"이면 코드가 정렬되지 않은 경우에 대해 'invalid'부동 소수점 예외를 발생시키는 데 필요한 추가 코드 인 경우 바람직 할 수 있습니다.

+0

'isgreaterequal' 외의 명세에 따르면'FE_INVALID'는'> ='에 의해 발생하지만'> = '를 지정하는 올바른 장소가 아닙니다. 필자의 경험에 비추어 볼 때, 인텔 FE_INVALID는 NaN에서 결코 벗어나지 못하지만, C가 제기 될 수있는 부분을 알지 못합니다. 기껏해야 신호 비교에 의존하는 것은 불가능합니다. – Potatoswatter

+0

당신이 읽고있는 문서는 어디에 있습니까? –

+0

[gnu.org] (http://www.gnu.org/software/libc/manual/html_node/FP-Comparison-Functions.html#FP-Comparison-Functions)도 똑같은 것을 보여 줍니 다. 이걸 시험해 봐. –