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

정확한 부동 소수점 비교를 위해 Double.Epsilon을 어떻게 사용해야 합니까?

Patricia Arquette
풀어 주다: 2025-01-06 03:28:43
원래의
905명이 탐색했습니다.

How Should Double.Epsilon Be Used for Accurate Floating-Point Comparisons?

Float 및 Double 비교를 위한 Double.Epsilon

질문:

System.Double.Epsilon에 대한 MSDN 설명서에는 다음과 같은 내용이 나와 있습니다. 평등을 결정하기 위한 차이의 한계로 사용되어서는 안 됩니다. 부동 소수점 비교에 Double.Epsilon을 어떻게 사용해야 합니까?

답변:

MSDN 설명은 오해의 소지가 있습니다. Double.Epsilon은 표현 가능한 0이 아닌 가장 작은 부동 소수점 값을 나타냅니다. 따라서 스택 오버플로 스레드 "부동 및 이중 비교에 가장 효과적인 방법은 무엇입니까?"에서 제공되는 예제에서 엡실론으로 사용할 수 있습니다.

동등을 위해 적합한 엡실론을 수학으로 추정할 수 있습니다. Max(Math.Abs(x), Math.Abs(y)) * 1E-15, 여기서 x와 y는 비교되는 double 값입니다. 그러나 잘림 오류가 누적될 수 있으므로 계산된 값을 비교할 때 더 큰 엡실론이 필요할 수 있다는 점에 유의하는 것이 중요합니다.

같음, 보다 큼, 보다 작음, 작거나 같음, 크거나 같음을 구현하려면 다음 코드를 사용할 수 있습니다:

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;
}

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

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

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

public static bool GreaterThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x >= y - epsilon;
}
로그인 후 복사

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿