질문:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!