Maison > développement back-end > C++ > Comment Double.Epsilon doit-il être utilisé pour des comparaisons précises en virgule flottante ?

Comment Double.Epsilon doit-il être utilisé pour des comparaisons précises en virgule flottante ?

Patricia Arquette
Libérer: 2025-01-06 03:28:43
original
905 Les gens l'ont consulté

How Should Double.Epsilon Be Used for Accurate Floating-Point Comparisons?

Double.Epsilon pour les comparaisons flottantes et doubles

Question :

La documentation MSDN pour System.Double.Epsilon indique qu'elle ne devrait pas être utilisée comme marge de différence pour déterminer l'égalité. Comment Double.Epsilon doit-il être utilisé pour les comparaisons à virgule flottante ?

Réponse :

La déclaration MSDN est trompeuse. Double.Epsilon représente la plus petite valeur à virgule flottante représentable non nulle. Par conséquent, il peut être utilisé comme epsilon dans les exemples fournis dans le fil de discussion Stack Overflow "Quel est le moyen le plus efficace pour la comparaison flottante et double ?"

Pour l'égalité, un epsilon approprié peut être estimé comme Math. Max(Math.Abs(x), Math.Abs(y)) * 1E-15, où x et y sont les valeurs doubles comparées. Cependant, il est important de noter que les erreurs de troncature peuvent s'accumuler, donc un epsilon plus grand peut être nécessaire lors de la comparaison des valeurs calculées.

Pour implémenter l'égalité, supérieur à, inférieur à, inférieur ou égal à et supérieur ou égal à égal à, le code suivant peut être utilisé :

public static bool AboutEqual(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return Math.Abs(x - y) <= epsilon;
}

public static bool GreaterThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x > y + epsilon;
}

public static bool LessThan(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x < y - epsilon;
}

public static bool LessThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x <= y + epsilon;
}

public static bool GreaterThanOrEqualTo(double x, double y) {
    double epsilon = Math.Max(Math.Abs(x), Math.Abs(y)) * 1E-15;
    return x >= y - epsilon;
}
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal