X
과 다음 값인 X
의 차이는 X
에 따라 다릅니다.
DBL_EPSILON
은 1
과 다음 값 1
사이의 차이입니다.
당신은 엡실론 차이가 두 double
을 테스트 std::nextafter
을 사용할 수 있습니다 : 당신이 요인 * 엡실론의 차이가 두 double
을 테스트하려는 경우
bool nearly_equal(double a, double b)
{
return std::nextafter(a, std::numeric_limits<double>::lowest()) <= b
&& std::nextafter(a, std::numeric_limits<double>::max()) >= b;
}
, 당신은 사용할 수 있습니다
bool nearly_equal(double a, double b, int factor /* a factor of epsilon */)
{
double min_a = a - (a - std::nextafter(a, std::numeric_limits<double>::lowest())) * factor;
double max_a = a + (std::nextafter(a, std::numeric_limits<double>::max()) - a) * factor;
return min_a <= b && max_a >= b;
}
'approximately_equal'을 지수 값이 변하기 때문에 현재 값과 다음으로 가장 가까운 표현 가능한 값 사이의 간격 크기가 크기와 함께 변하기 때문에 매우 큰 값에 대해서는 올바르게 작동하지 않습니다. 이를 적절하게 수행하려면 비교되는 값을 기반으로 상황에 맞는 정확한 엡실론을 다시 계산해야합니다. – numist
@numist,'max (fabs) '에 의해 ε을 곱하면 정확한 크기가 주어져야하며, ulp 인수는 이미 누적 된 상대적 오류에 대한 컨텍스트 정보를 제공합니다. 여전히 문제가 있다고 생각되면 소스를 더 명확하게 할 수 있습니까? – AProgrammer
엡실론은 연속적인 방식으로 비례하지 않습니다. IEEE 인코딩의 경우, 엡실론은베이스 2의 값에 비례합니다. http://stackoverflow.com/questions/5064377/c-comparing-two-floating-point-values/35536839#35536839 –