Maison > développement back-end > C++ > Double.Epsilon est-il le bon outil pour comparer des nombres à virgule flottante ?

Double.Epsilon est-il le bon outil pour comparer des nombres à virgule flottante ?

Barbara Streisand
Libérer: 2025-01-05 02:58:39
original
740 Les gens l'ont consulté

Is Double.Epsilon the Right Tool for Comparing Floating-Point Numbers?

Double.Epsilon : une mesure de précision fiable pour l'égalité et les inégalités numériques

Introduction

Le concept « epsilon » joue un rôle crucial dans l'analyse numérique lors de la comparaison de nombres à virgule flottante. Double.Epsilon, une constante définie dans la classe System.Double, représente la plus petite valeur à virgule flottante positive représentable supérieure à zéro.

Double.Epsilon peut-il être utilisé pour des comparaisons directes ?

Contrairement à ce qui est indiqué dans la documentation MSDN, Double.Epsilon ne peut pas être directement utilisé pour déterminer l'égalité de deux nombres à virgule flottante. Bien qu'elle puisse servir de valeur seuil pour les différences acceptables dans les algorithmes personnalisés, elle ne fournit pas une mesure précise de l'équivalence numérique.

Détermination de l'égalité en virgule flottante

Pour Pour des raisons pratiques, une approche alternative est recommandée. Pour comparer deux valeurs doubles, x et y, pour l'égalité, une valeur epsilon approximativement constante * 1E-15 est généralement utilisée. Cet epsilon tient compte des limitations de précision inhérentes au type de données Double, permettant jusqu'à 15 chiffres significatifs de précision.

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

Résolution des erreurs de troncature

Cependant, il est important de prendre en compte le risque d'erreurs de troncature lorsque vous travaillez avec des valeurs calculées. Dans de tels cas, la valeur epsilon devra peut-être être augmentée pour tenir compte de la possibilité d'erreur accumulée.

Mise en œuvre des comparaisons d'inégalités

Pour les comparaisons d'inégalités (supérieures à, inférieures à , inférieur ou égal à, supérieur ou égal à), des principes similaires s'appliquent. La même valeur epsilon peut être utilisée avec prudence, en veillant à ce qu'elle soit suffisamment grande pour tenir compte d'une erreur potentielle.

// Greater than
bool gt = x > (y + epsilon);

// Less than
bool lt = x < (y - epsilon);

// Less than or equal to
bool lte = x <= (y + epsilon);

// Greater than or equal to
bool gte = x >= (y - epsilon);
Copier après la connexion

Conclusion

Alors que Double.Epsilon fournit une point de référence pour la précision en virgule flottante, il ne faut pas s’y fier pour des comparaisons directes d’égalité. En adoptant une approche basée sur l'epsilon avec un ajustement approprié pour les erreurs de troncature, les développeurs peuvent garantir des comparaisons numériques fiables et précises lors de l'utilisation de doubles.

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