동치 및 비교 연산을 위한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!