std::map Comparaison de clés à virgule flottante
L'utilisation de valeurs à virgule flottante comme clés dans std::maps peut poser des problèmes en raison de l'imprécision inhérente à l'arithmétique à virgule flottante. Un problème courant est que la comparaison de clés à virgule flottante à l'aide d'une égalité stricte (==) peut ne pas toujours fonctionner comme prévu, car même des valeurs apparemment exactes peuvent ne pas correspondre en raison d'une erreur de précision.
Dans l'exemple de code donné, le la boucle tente de trouver la clé 3.0 dans un std::map, mais échoue car la boucle incrémente la clé de recherche en utilisant = 0,1, ce qui peut ne pas correspondre précisément à la valeur de clé attendue en raison de la précision en virgule flottante inexactitudes.
Pour résoudre ce problème, vous pouvez utiliser la fonction std::setprecision dans votre programme pour spécifier le nombre de décimales à prendre en compte lors de la comparaison des clés. Cependant, cette approche peut encore être peu fiable car elle ne garantit pas que les clés se compareront exactement.
Une meilleure solution consiste à utiliser une fonction de comparaison approximative dans votre std::map. Vous pouvez définir un comparateur personnalisé qui utilise un seuil epsilon pour déterminer l'égalité des clés. Cela vous permet de comparer les clés dans une certaine tolérance, en ignorant efficacement les différences de précision mineures :
struct fuzzy_double_comparator { bool operator() (const double a, const double b) const { return std::fabs(a - b) < epsilon; } };
Cette fonction de comparaison peut ensuite être transmise au constructeur std::map pour utiliser la comparaison approximative :
std::map<double, double, fuzzy_double_comparator> mymap;
Avec cette approche, vous pouvez trouver la clé 3.0 dans le std::map même si sa valeur réelle est légèrement différente en raison des limitations de précision en virgule flottante.
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!