2009-07-07 24 views
14

Kann jemand den Unterschied im Verhalten zwischen BOOST_CHECK_CLOSE und BOOST_CHECK_CLOSE_FRACTION beschreiben? The documentation impliziert, dass beide Makros ihren dritten Parameter identisch behandeln, was mich vermuten lässt, dass die Dokumentation falsch ist.Unterschied zwischen BOOST_CHECK_CLOSE und BOOST_CHECK_CLOSE_FRACTION?

Insbesondere BOOST_CHECK_CLOSE_FRACTION gibt mir ein paar seltsam aussehende Ergebnisse:

error in "...": difference between *expected{0} and *actual{-1.7763568394002506e-16} exceeds 9.9999999999999995e-07 

Gibt es eine Gotcha, weil ich ein Null-Ergebnis erwarten? Ich war nicht erfolgreich beim Lesen der zugrunde liegenden Makro-Deklarationen. Bitte beachten Sie, dass BOOST_CHECK_SMALL für meinen Anwendungsfall nicht geeignet ist (Vergleich zweier Vektoren nach einer linearen Algebraoperation).

Antwort

6

Laut this discussion behandelt eine (BOOST_CHECK_CLOSE) den dritten Parameter als Prozentwert, während der andere (BOOST_CHECK_CLOSE_FRACTION) es als Ausdruck eines Bruchteils behandelt. Also, .01 in der ersten sollte gleichwertig zu .0001 in der zweiten sein.

Nicht sicher, ob das Ihr Problem erklärt - erhalten Sie dasselbe ungerade Ergebnis mit BOOST_CHECK_CLOSE? Ich wäre nicht schockiert, wenn die 0 ein Problem verursacht hätte - aber ich habe keine Erfahrung mit den Makros aus erster Hand.

+1

Vielen Dank für die Antwort. Es scheint, dass die Null das Problem verursacht, und das ähnliche Verhalten bei einem Null-Argument für BOOST \ _CHECK \ _CLOSE und BOOST \ _CHECK \ _CLOSE \ _FRACTION auftritt –

5

Ja. Null ist keinem Wert "nahe". Sie können stattdessen BOOST_CHECK_SMALL verwenden.

1

@Gennadiy: Null kann einen kleinen Wert in der Nähe sein. :-) Relative Differenzen wachsen beliebig groß, wenn der Erwartungswert sehr nahe bei Null liegt.

ist hier eine Abhilfe Funktion I Doppelwerte zu Unit-Test verwendet werden: wenn der erwartete Wert ist sehr klein oder Null ist, dann überprüfe ich die Kleinheit des beobachteten Wert, sonst Nähe Ich überprüfe:

void dbl_check_close(
    double expected, double observed, 
    double small, double pct_tol 
) { 
    if (std::fabs(expected) < small) { 
     BOOST_CHECK_SMALL(observed, small); 
    } else { 
     BOOST_CHECK_CLOSE(expected, observed, pct_tol); 
    } 
} 

Of Natürlich wäre es toll, einen BOOST_CHECK_SMALL_OR_CLOSE Makro zu haben, der das automatisch macht. Gennadiy könnte vielleicht mit dem Autor von Boost reden.Test ;-)