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