EDIT: In dieser Version wird überprüft, dass die Zahlen nicht mehr als einen Bruchteil (z.B. 0,0001%) voneinander abweichen:
bool floatApproximatelyEquals(const float a, const float b) {
if (b == 0.) return a == 0.; // preventing division by zero
return abs(1. - a / b) < 1e-6;
}
Bitte beachten Sie Sneftel die Bemerkung über mögliche Fraktionsgrenzen für Float.
Beachten Sie auch, dass es sich von der Herangehensweise mit absoluten Epsilons unterscheidet - hier kümmert man sich nicht um "Größenordnungen" - die Zahlen könnten z.B. sein 1e100
o 1e-100
werden sie immer einheitlich verglichen, und Sie müssen epsilon nicht in jedem Fall aktualisieren.
Alte Antwort: Auf folgende Weise vergleichen Sie die systemabhängige "String-Darstellung" von zwei Werten (in Ihrem Fall Floats). Ähnlich, wie wenn Sie beide ausdrucken und mit Ihren Augen sehen, ob sie gleich aussehen:
#include <iostream>
#include <string>
bool floatApproximatelyEquals(const float a, const float b) {
return std::to_string(a) == std::to_string(b);
}
Proc:
- Der Zahlenfaktor (oder die Potenz) wird effektiv berücksichtigt, so dass es keine Rolle spielt, ob die Zahlen 1,2 oder 1,2e345678 oder 0,00000123 oder 1,2e-345678 sind (das Problem, das normalerweise bei absoluten Epsilons auftritt).
Nachteile:
- Sie haben keine Kontrolle über die Genauigkeit, mit der Sie Zahlen "runden". Auf meinem System sind es z. B. 6 Stellen nach der ersten signifikanten Stelle (nicht Null) in der Dezimaldarstellung der Zahl (was für die meisten meiner Fälle ausreicht)