Maison >développement back-end >C++ >Quand et comment Double.Epsilon doit-il être utilisé pour comparer des nombres à virgule flottante double précision ?

Quand et comment Double.Epsilon doit-il être utilisé pour comparer des nombres à virgule flottante double précision ?

DDD
DDDoriginal
2025-01-05 17:04:43304parcourir

When and How Should Double.Epsilon Be Used for Comparing Double-Precision Floating-Point Numbers?

Double.Epsilon pour les opérations d'égalité et de comparaison

La constante Double.Epsilon contient la plus petite virgule flottante positive nombre qui peut être représenté comme un double sans arrondir à zéro. Il est destiné à servir de guide pour les comparaisons à virgule flottante, mais sa documentation peut prêter à confusion.

Double.Epsilon peut-il être utilisé pour une comparaison directe ?

Non. Double.Epsilon définit la plus petite erreur de troncature possible. Cela signifie que lors de l'exécution d'opérations mathématiques, les nombres à virgule flottante peuvent différer davantage que Double.Epsilon en raison des arrondis. Par conséquent, l'utilisation de Double.Epsilon pour des comparaisons directes peut ne pas refléter avec précision l'égalité mathématique.

Alternatives pour des comparaisons précises

Considérez les alternatives suivantes :

  • Calcul Epsilon simple : Pour des comparaisons d'égalité simples, vous pouvez utiliser un petit epsilon en fonction de l'ampleur des valeurs comparées. Par exemple :
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;
}
  • Tolérance relative : Utilisez une tolérance relative pour tenir compte des différences d'ampleur. Par exemple :
public static bool ApproximatelyEqualRelative(double x, double y, double tolerance) {
    return Math.Abs(x - y) / Math.Max(Math.Abs(x), Math.Abs(y)) <= tolerance;
}

Implémentations pour d'autres opérations de comparaison

Pour implémenter des comparaisons supérieures à (>) et inférieures à (<), inversez la logique utilisée pour l'égalité :

  • Plus grand Que :

    public static bool GreaterThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) > 0;
    }
  • Moins de :

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }

Pour supérieur ou égal à (>=) et inférieur ou égal à (<=), modifiez les implémentations ci-dessus en conséquence :

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;
}

N'oubliez pas que ces implémentations ne sont que des approximations et doivent être utilisées avec prudence dans les situations où des comparaisons précises sont cruciales.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn