2010-09-16 9 views
9

Ich bekomme dieses Code-Schnipsel von einigen wo sonst. Laut dem Webmaster wird der Code von The art of computer programming by KnuthUnterschied zwischen ungefähr gleich und im Wesentlichen gleich in der Kunst der Computerprogrammierung

ausgewählt Da ich keine Kopie dieses Buches habe, darf ich wissen, was ist der Unterschied zwischen den beiden Funktionen?

bool approximatelyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

bool essentiallyEqual(float a, float b, float epsilon) 
{ 
    return fabs(a - b) <= ((fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon); 
} 

Antwort

11

ein Beispiel geben:

double a = 95.1, b = 100.0; 
assert(approximatelyEqual(a, b, 0.05)); 
assert(!essentiallyEqual(a, b, 0.05)); 

das heißt mit epsilon 5% beträgt, 95.1 beträgt etwa 100, wie es in der 5% Rand des 100-Wert (größten) fällt. Auf der anderen Seite ist 95.1 nicht wesentlich 100, da 100 nicht innerhalb einer 5% Differenz von 95.1 (kleinster Wert) ist.

+0

Kann ich sagen, im Wesentlichen wird Equal immer einen 'näher'-Wert als ungefähr gleich brauchen? –

+0

Ja, 'im WesentlichenEqual'-Werte sind immer" näher "als" annäherndEqual "-Werte. – palswim

+3

Denken Sie an die Angebote in Ihrem normalen Geschäft und welche Prozentsätze bedeuten dort. Was ist wertvoller 33% Rabatt im Preis oder 33% extra kostenloses Produkt? Die Lösung ist, dass Sie den 33% Rabatt bevorzugen sollten, da dies einem 50% extra kostenlosen Produktangebot entspricht. Das gleiche passiert hier, abhängig davon, ob Sie das Epsilon um den größeren oder kleinsten der beiden Werte ziehen, wird das Ergebnis unterschiedlich sein. 66,6 ist ungefähr gleich 100 mit einem 33% Epsilon, aber nur im Wesentlichen gleich mit einem 50% Epsilon. –

9

approximatelyEqual gibt, ob die Differenz zwischen ab und kleiner ist als der akzeptable Fehler (epsilon), durch die größere von a oder b bestimmt. Dies bedeutet, dass die beiden Werte "nah genug" sind und wir sagen können, dass sie ungefähr gleich sind.

essentiallyEqual gibt, ob die Differenz zwischen ab und kleiner ist als der akzeptable Fehler (epsilon), durch die kleinere von a oder b bestimmt. Dies bedeutet, dass die Werte weniger als die akzeptable Differenz in jeder Berechnung abweichen, so dass sie vielleicht nicht gleich sind, aber sie sind "im Wesentlichen gleich" (angesichts der epsilon).

Dies hat Anwendungen in Bereichen, in denen wir Daten und "akzeptable Fehler" Raten und so. Dieser Code gibt Ihnen nur eine algorithmische Definition dieser Begriffe.

+0

Können Sie ein Beispiel aus der realen Welt geben, wie wir zwischen den 2 Funktionen wählen sollten? –

+0

'Dies bedeutet, dass die Werte weniger als die akzeptable Differenz in jeder Berechnung abweichen. - Wenn die Werte unterschiedlich sind, bedeutet dies auch' nah genug '? Also, was wird es von "ungefähr gleich" unterscheiden? –

+0

Hier ist ein [medizinischer Artikel] (http://www.pnas.org/content/95/3/811.full), der beide Begriffe verwendet. Es ist nicht unbedingt, wie Sie wählen, aber es ist auch, wie Sie Daten beschreiben. – palswim

3

Der Unterschied ist, dass wesentliche Gleichheit ungefähre Gleichheit bedeutet, aber nicht umgekehrt. So ist die wesentliche Gleichheit stärker als die ungefähre Gleichheit.

Auch wesentliche Gleichheit ist nicht transitiv, aber wenn a im wesentlichen gleich b und b im wesentlichen gleich c, dann a-c ungefähr gleich ist (für einen anderen Wert von Epsilon).

+0

+1 für die transitive Analyse –

Verwandte Themen