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