>백엔드 개발 >C++ >부동 소수점 비교를 위해 Double.Epsilon을 사용해야 합니까?

부동 소수점 비교를 위해 Double.Epsilon을 사용해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2025-01-05 04:58:42488검색

Should I Use Double.Epsilon for Floating-Point Comparisons?

부동 소수점 비교의 Double.Epsilon

질문:

MSDN 문서 Double.Epsilon은 부동 소수점 간의 동등성을 결정하는 데 사용해서는 안 된다고 명시합니다. 숫자. 그러나 일부 리소스에서는 비교를 위해 이를 사용하는 것이 좋습니다. 같음 및 보다 큼, 보다 작음과 같은 기타 비교에 Double.Epsilon을 사용할 수 있습니까?

답변:

Epsilon 값은 표현 가능한 가장 작은 비를 나타냅니다. -0이 아닌 비정규 부동 소수점 값. 비교에서 엡실론의 자연스러운 후보처럼 보일 수 있지만 충분히 정확하지는 않습니다. 목적.

Double.Epsilon은 표현 가능한 가장 작은 잘림 오류를 반영하지만 비교되는 숫자의 크기에 따라 크게 달라집니다. 예를 들어 1에 가까운 두 숫자의 경우 Double.Epsilon은 0.0000000000000002220446이 될 수 있고, 1,000,000,000,000,000에 가까운 두 숫자의 경우 222,044,604,925,093,800이 될 수 있습니다. 이는 동등성 또는 기타 비교를 위해 Double.Epsilon에 의존하면 일관된 결과를 제공하지 못한다는 것을 의미합니다.

균등성을 위한 대체 Epsilon 추정:

부동 비교를 위해 권장되는 한 가지 접근 방식 동등성을 위한 포인트 값은 상수 * 1E-15의 엡실론을 사용하는 것입니다. 이는 Double 형식이 값을 15자리까지 정확하게 나타낼 수 있다는 것과 유사합니다. 예:

public static bool AboutEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

비교 연산자:

Double.Epsilon은 비교에 직접 사용할 수 없지만 AboutEqual 메서드는 초과, 미만에 적용할 수 있습니다. , 작거나 같음, 크거나 같음:

  • 보다 큼: x > y && !AboutEqual(x, y)
  • 보다 작음: x < y && !AboutEqual(x, y)
  • 다음보다 작거나 같음: AboutEqual(x, y) || x < y
  • 보다 크거나 같음: AboutEqual(x, y) || x > y
  • 추가 고려 사항:

    특히 계산된 값을 처리할 때 잘림 오류가 누적될 수 있다는 점에 유의하는 것이 중요합니다. 따라서 적절한 정밀도를 얻으려면 그에 따라 엡실론 값을 조정해야 할 수도 있습니다.

    위 내용은 부동 소수점 비교를 위해 Double.Epsilon을 사용해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.