2009-07-07 7 views
14

BOOST_CHECK_CLOSE ve BOOST_CHECK_CLOSE_FRACTION arasındaki davranıştaki farkı tanımlayabilir mi? The documentation, her iki makronun da üçüncü parametrelerini aynı şekilde ele aldığını ve bu da belgenin yanlış olduğunu düşündüğümü gösterir. Ben sıfır sonuç bekliyoruz çünküBOOST_CHECK_CLOSE ve BOOST_CHECK_CLOSE_FRACTION arasındaki fark nedir?

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

gereken bir nokta var mı: Özellikle

, BOOST_CHECK_CLOSE_FRACTION bana biraz garip görünümlü sonuçlar verir? Altta yatan makro deklarasyonları okurken başarılı olamadım. Lütfen kullanım durumum için BOOST_CHECK_SMALL'un uygun olmadığını unutmayın (doğrusal cebir işleminden sonra iki vektörün karşılaştırılması).

cevap

6

this discussion'a göre, bir (BOOST_CHECK_CLOSE) üçüncü parametreyi yüzde ifade ederken ele alırken, diğeri (BOOST_CHECK_CLOSE_FRACTION) bir kesir ifade eder. Yani, ilkinde .01 saniyede .0001'e eşdeğer olmalıdır.

Sorununuzu açıklıyorsa kesin değil - BOOST_CHECK_CLOSE ile aynı garip sonucu alıyor musunuz? 0 bir sorun yarattıysa şok olmazdım - ama makrolarla ilk elden deneyimim yok.

+1

Yanıt için teşekkür ederiz. Sıfır sorunun neden olduğu ve benzer davranışın hem BOOST \ _CHECK \ _CLOSE hem de BOOST \ _CHECK \ _CLOSE \ _FRACTION için bir sıfır bağımsız değişkeni ile gerçekleştiği görülüyor. –

5

Evet. Sıfır, herhangi bir değere "yakın" değildir. Bunun yerine BOOST_CHECK_SMALL uygulamasını kullanabilirsiniz.

1

@Gennadiy: Zero herhangi bir küçük değerlerine yakın olabilir. :-) Göreceli farkları, beklenen değer sıfıra çok yakınsa rasgele büyür. Burada

ı birimi test çift değerleri için kullanılan bir çözüm fonksiyonudur: beklenen değeri çok küçüktür ya da sıfır sonra gözlenen değer küçüklüğü kontrol durumunda, aksi takdirde kontrol yakınlık: The

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); 
    } 
} 

Tabii ki bunu otomatik olarak yapan bir BOOST_CHECK_SMALL_OR_CLOSE makrosu olması harika olurdu. Gennadiy belki de Boost.Test'in yazarıyla konuşabilirdi ;-)

İlgili konular