2010-01-21 18 views
5

używam biblioteki Boost :: Test, a ja staram się sprawdzić, jeśli wartość rzeczywista procent jest zbliżony do wartości oczekiwanej:problem z BOOST_CHECK_CLOSE_FRACTION

BOOST_CHECK_CLOSE_FRACTION(
    items[i].ExpectedPercent, 
    items[i].ActualCount/totalCount, 
    0.05); 

Z jakiegoś powodu ten test się nie powiedzie, nawet gdy wartości są wystarczająco zbliżone:

difference between items[i].ExpectedPercent{0.40000000000000002} 
    and items[i].ActualCount/totalReturned{0.42999999999999999} 
            exceeds 0.050000000000000003 

Czy to jest problem z funkcją Boost, czy też problem z korzystaniem z funkcji Boost?

Odpowiedz

3

Po kilku testach okazuje się, że dokumentacja BOOST_CHECK_CLOSE_FRACTION jest niepoprawna. Tolerancję należy podać jako ułamek oczekiwanej wartości.

Więc TFAE:

BOOST_CHECK(abs(x - y) < (min(x, y) * 0.1)); 
BOOST_CHECK_CLOSE(x, y, 10); 
BOOST_CHECK_CLOSE_FRACTION(x, y, 0.1); 
+1

którą proponujemy, aby sprawdzić jeśli istnieje powiązany raport w Boost Trac, a jeśli nie, zgłoś go tam lub wyślij komentarz do listy mailingowej Boost. – mloskot

2

To jest problem z tym, jak używasz doładowania.

Ostatnim argumentem jest procentowa tolerancja, a nie bezwzględna wartość odchylenia. 5% z 0,4 to 0,02.

0

Oczywiście BOOST_CHECK_CLOSE i BOOST_CHECK_CLOSE_FRACTION nie będzie działać, jeśli sprawdzeniu, czy coś jest blisko 0. Następnie można użyć:

BOOST_CHECK(abs(x - y) < accurancy);