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
Libérer: 2025-01-05 17:04:43
original
287 Les gens l'ont consulté

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;
}
Copier après la connexion
  • 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;
}
Copier après la connexion

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;
    }
    Copier après la connexion
  • Moins de :

    public static bool LessThan(double x, double y) {
        return ApproximatelyEqualRelative(x - y, y, 1E-15) < 0;
    }
    Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal