Maison > développement back-end > C++ > Comment utiliser `std::map` avec des clés à virgule flottante : une solution pour les comparaisons inexactes ?

Comment utiliser `std::map` avec des clés à virgule flottante : une solution pour les comparaisons inexactes ?

DDD
Libérer: 2024-11-14 22:15:03
original
652 Les gens l'ont consulté

How to Use `std::map` with Floating-Point Keys: A Solution for Inaccurate Comparisons?

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 d'inexactitudes en virgule flottante.

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

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

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal