>백엔드 개발 >C++ >배정밀도 부동 소수점 숫자를 비교하기 위해 언제, 어떻게 Double.Epsilon을 사용해야 합니까?

배정밀도 부동 소수점 숫자를 비교하기 위해 언제, 어떻게 Double.Epsilon을 사용해야 합니까?

DDD
DDD원래의
2025-01-05 17:04:43290검색

When and How Should Double.Epsilon Be Used for Comparing Double-Precision Floating-Point Numbers?

동치 및 비교 연산을 위한 Double.Epsilon

Double.Epsilon 상수는 가장 작은 양수 부동 소수점을 보유합니다. 0으로 반올림하지 않고 double로 표시할 수 있는 숫자입니다. 부동 소수점 비교를 위한 지침으로 작성되었지만 설명서가 혼란스러울 수 있습니다.

Double.Epsilon을 직접 비교에 사용할 수 있습니까?

아니요. Double.Epsilon은 가능한 가장 작은 잘림 오류를 정의합니다. 즉, 수학 연산을 수행할 때 부동 소수점 숫자는 반올림으로 인해 Double.Epsilon보다 더 많이 다를 수 있습니다. 따라서 직접 비교를 위해 Double.Epsilon을 사용하면 수학적 동등성이 정확하게 반영되지 않을 수 있습니다.

정확한 비교를 위한 대안

다음 대안을 고려하십시오.

  • 간단한 엡실론 계산: 간단한 경우 동등 비교에서는 비교되는 값의 크기를 기반으로 작은 엡실론을 사용할 수 있습니다. 예:
public static bool ApproximatelyEqual(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 ApproximatelyEqualRelative(double x, double y, double tolerance) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance;
}

다른 비교 연산을 위한 구현

보다 큼(>) 및 작음(<) 비교를 구현하려면 반전을 수행합니다. 에 사용되는 논리 평등:

  • 보다 큼:

    public static bool GreaterThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0;
    }
  • 적음 Than:

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }

크거나 같음(>=) 및 작거나 같음(<=) 비교의 경우 그에 따라 위 구현을 수정합니다.

public static bool GreaterThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) >= 0;
}

public static bool LessThanOrEqual(double x, double y) {
    return ApproximatelyEqualRelative(x - y, y, 1E-15) <= 0;
}

이러한 구현은 근사치일 뿐이므로 정확한 비교가 필요한 상황에서는 주의해서 사용해야 합니다. 결정적입니다.

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

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