Maison >développement back-end >C++ >Comment comparer avec précision les valeurs à virgule flottante tout en tenant compte de la perte de précision ?

Comment comparer avec précision les valeurs à virgule flottante tout en tenant compte de la perte de précision ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-25 07:48:33864parcourir

How Can Floating-Point Values Be Compared Accurately While Accounting for Precision Loss?

Comparaison de valeurs à virgule flottante avec conservation de précision

La comparaison à virgule flottante pose un défi en raison de la perte de précision. Comparer simplement des doubles ou des flottants à l'aide de == n'est pas fiable.

Comparaison basée sur Epsilon

Une approche consiste à utiliser un seuil epsilon (ε) pour tenir compte de la perte de précision :

bool CompareDoubles2(double A, double B) {
  double diff = A - B;
  return (diff < EPSILON) && (-diff < EPSILON);
}

Cependant, cette approche peut être inefficace.

Considérations dépendantes du contexte

Le choix de la méthode de comparaison dépend du contexte et des valeurs attendues. Considérez les pièges potentiels suivants :

  • En supposant que a == b et b == c implique a == c.
  • Utiliser le même epsilon pour différentes unités de mesure.
  • Utilisation d'epsilon pour les angles et les longueurs de ligne.
  • Tri à l'aide d'une telle comparaison function.

Standard Epsilon

std::numeric_limits::epsilon() représente la différence entre 1,0 et la valeur suivante représentable par un double . Il peut être utilisé dans les fonctions de comparaison, mais seulement si les valeurs attendues sont inférieures à 1.

Conséquences de l'arithmétique entière

L'utilisation de doubles pour contenir des valeurs entières peut conduire à corriger arithmétique, à condition d'éviter les fractions ou les valeurs en dehors de la plage d'un nombre entier. Par exemple, 4,0/2,0 sera égal à 1,0 1,0.

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!

Déclaration:
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