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