J'essaie de trouver du code Java pour déterminer si deux doubles sont presque égaux. J'ai fait beaucoup de Google et trouvé des morceaux que j'ai rassemblés ici. Là où ça commence à m'échapper c'est l'utilisation d'un "epsilon relatif". Cette approche semble être ce que je cherche. Je ne veux pas avoir à spécifier l'epsilon directement, mais je veux utiliser un epsilon basé sur les amplitudes des deux arguments. Voici le code que j'ai mis ensemble, j'ai besoin d'un contrôle de santé mentale dessus. (Post-scriptum Je sais juste assez de mathématiques pour être dangereux.)Comment déterminer si deux doubles sont presque égaux
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;
}
}
}
Un ulp est probablement un peu trop petit d'un epsilon. –
Des recommandations sur comment je devrais le faire? – careysb
Ah, @ Louis Wasserman, ressemble à ce que Klaus a mentionné. – careysb