/// testing whether two doubles are almost equal. We consider two doubles
/// equal if the difference is within the range [0, epsilon).
///
/// epsilon: a positive number (supposed to be small)
///
/// if either x or y is 0, then we are comparing the absolute difference to
/// epsilon.
/// if both x and y are non-zero, then we are comparing the relative difference
/// to epsilon.
bool almost_equal(double x, double y, double epsilon)
{
double diff = x - y;
if (x != 0 && y != 0){
diff = diff/y;
}
if (diff < epsilon && -1.0*diff < epsilon){
return true;
}
return false;
}
Ich habe diese Funktion für mein kleines Projekt verwendet und sie funktioniert, aber beachten Sie Folgendes:
Fehler mit doppelter Genauigkeit können für eine Überraschung sorgen. Nehmen wir an, epsilon = 1,0e-6, dann sollten 1,0 und 1,000001 nach dem obigen Code NICHT als gleich angesehen werden, aber auf meinem Rechner sieht die Funktion sie als gleich an, weil 1,000001 nicht genau in ein Binärformat übersetzt werden kann, es ist wahrscheinlich 1,0000009xxx. Ich teste es mit 1,0 und 1,0000011 und erhalte diesmal das erwartete Ergebnis.