Heim > Backend-Entwicklung > C++ > Wie verwende ich „std::map' mit Gleitkommaschlüsseln: Eine Lösung für ungenaue Vergleiche?

Wie verwende ich „std::map' mit Gleitkommaschlüsseln: Eine Lösung für ungenaue Vergleiche?

DDD
Freigeben: 2024-11-14 22:15:03
Original
651 Leute haben es durchsucht

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

std::map-Gleitkomma-Schlüsselvergleich

Die Verwendung von Gleitkommawerten als Schlüssel in std::maps kann aufgrund von Schwierigkeiten auftreten die inhärente Ungenauigkeit der Gleitkomma-Arithmetik. Ein häufiges Problem besteht darin, dass der Vergleich von Gleitkommaschlüsseln mit strikter Gleichheit (==) möglicherweise nicht immer wie erwartet funktioniert, da selbst scheinbar exakte Werte aufgrund von Präzisionsfehlern möglicherweise nicht übereinstimmen.

Im angegebenen Codebeispiel wird die Die Schleife versucht, den Schlüssel 3.0 in einer std::map zu finden, schlägt jedoch fehl, da die Schleife den Suchschlüssel mit = 0,1 inkrementiert, was aufgrund der Gleitkommagenauigkeit möglicherweise nicht genau mit dem erwarteten Schlüsselwert übereinstimmt Ungenauigkeiten.

Um dieses Problem zu beheben, können Sie die Funktion std::setprecision in Ihrem Programm verwenden, um die Anzahl der Dezimalstellen anzugeben, die beim Vergleich von Schlüsseln berücksichtigt werden sollen. Dieser Ansatz kann jedoch immer noch unzuverlässig sein, da er nicht garantiert, dass die Schlüssel genau vergleichbar sind.

Eine bessere Lösung besteht darin, eine ungefähre Vergleichsfunktion in Ihrer std::map zu verwenden. Sie können einen benutzerdefinierten Komparator definieren, der einen Epsilon-Schwellenwert verwendet, um die Schlüsselgleichheit zu bestimmen. Dadurch können Sie Schlüssel innerhalb einer bestimmten Toleranz vergleichen und dabei kleinere Präzisionsunterschiede effektiv ignorieren:

struct fuzzy_double_comparator {
    bool operator() (const double a, const double b) const {
        return std::fabs(a - b) < epsilon;
    }
};
Nach dem Login kopieren

Diese Komparatorfunktion kann dann an den std::map-Konstruktor übergeben werden, um den ungefähren Vergleich zu verwenden:

std::map<double, double, fuzzy_double_comparator> mymap;
Nach dem Login kopieren

Mit diesem Ansatz können Sie den Schlüssel 3.0 in der std::map finden, auch wenn sein tatsächlicher Wert aufgrund der Gleitkommagenauigkeit geringfügig abweicht Einschränkungen.

Das obige ist der detaillierte Inhalt vonWie verwende ich „std::map' mit Gleitkommaschlüsseln: Eine Lösung für ungenaue Vergleiche?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage