두 개의 double이 거의 같은지 확인하기 위해 Java 코드를 찾으려고합니다. 나는 많은 인터넷 검색을했고 내가 여기에 모아 놓은 작은 조각들을 발견했다. 그것이 나를 벗어나기 시작하는 곳은 "상대적인 엡실론"의 사용입니다. 이 접근법은 내가 찾는 것과 같습니다. 엡실론을 직접 지정하지 않고 두 인수의 크기에 따라 엡실론을 사용하고 싶습니다. 여기에 내가 작성한 코드가 있습니다. 나는 그것에 온전한 체크가 필요합니다. (추신 : 내가 아는 충분히 수학은 위험 할 수 있습니다.)두 개의 double이 거의 같은지 확인하는 방법
public class MathUtils
{
// http://stackoverflow.com/questions/3728246/what-should-be-the-
// epsilon-value-when-performing-double-value-equal-comparison
// ULP = Unit in Last Place
public static double relativeEpsilon(double a, double b)
{
return Math.max(Math.ulp(a), Math.ulp(b));
}
public static boolean nearlyEqual(double a, double b)
{
return nearlyEqual(a, b, relativeEpsilon(a, b));
}
// http://floating-point-gui.de/errors/comparison/
public static boolean nearlyEqual(double a, double b, double epsilon)
{
final double absA = Math.abs(a);
final double absB = Math.abs(b);
final double diff = Math.abs(a - b);
if(a == b)
{
// shortcut, handles infinities
return true;
}
else if(a == 0 || b == 0 || diff < Double.MIN_NORMAL)
{
// a or b is zero or both are extremely close to it
// relative error is less meaningful here
// NOT SURE HOW RELATIVE EPSILON WORKS IN THIS CASE
return diff < (epsilon * Double.MIN_NORMAL);
}
else
{
// use relative error
return diff/Math.min((absA + absB), Double.MAX_VALUE) < epsilon;
}
}
}
하나의 ulp는 아마도 약간의 엡실론입니다. –
어떻게해야합니까에 대한 권장 사항? – careysb
아, @ 루이스 와서 만, 클라우스가 말한 당신 물건들 같아. – careysb