2009-07-07 32 views
14

क्या कोई BOOST_CHECK_CLOSE और BOOST_CHECK_CLOSE_FRACTION के बीच व्यवहार में अंतर का वर्णन कर सकता है? The documentation का अर्थ है कि दोनों मैक्रोज़ समान रूप से उनके तीसरे पैरामीटर का इलाज करते हैं, जिससे मुझे संदेह होता है कि दस्तावेज़ीकरण गलत है।BOOST_CHECK_CLOSE और BOOST_CHECK_CLOSE_FRACTION के बीच अंतर?

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

वहाँ एक पकड़ लिया है क्योंकि मैं एक शून्य परिणाम की उम्मीद:

विशेष रूप से, BOOST_CHECK_CLOSE_FRACTION मुझे कुछ अजीब लग रही परिणाम देता है? मैं अंतर्निहित मैक्रो घोषणाओं के माध्यम से पढ़ने में सफल नहीं रहा हूं। कृपया ध्यान दें कि BOOST_CHECK_SMALL मेरे उपयोग के मामले के लिए उपयुक्त नहीं है (रैखिक बीजगणित ऑपरेशन के बाद दो वैक्टरों की तुलना)।

उत्तर

6

this discussion के अनुसार, एक (BOOST_CHECK_CLOSE) तीसरे पैरामीटर को प्रतिशत व्यक्त करने के रूप में मानता है, जबकि अन्य (BOOST_CHECK_CLOSE_FRACTION) इसे एक अंश व्यक्त करने के रूप में मानता है। तो, पहले में .01 दूसरे में .0001 के बराबर होना चाहिए।

यह निश्चित नहीं है कि यह आपकी समस्या बताता है - क्या आपको BOOST_CHECK_CLOSE के साथ एक ही अजीब परिणाम मिलता है? अगर 0 ने कोई समस्या उत्पन्न की है तो मुझे आश्चर्य नहीं होगा - लेकिन मैक्रोज़ के साथ मेरा पहला अनुभव नहीं है।

+1

के लेखक से बात कर सकता है प्रतिक्रिया के लिए धन्यवाद। ऐसा लगता है कि शून्य समस्या का कारण बनता है, और यह समान व्यवहार दोनों बूस्ट \ _CHECK \ _CLOSE और बूस्ट \ _CHECK \ _CLOSE \ _FRACTION दोनों के लिए एक शून्य तर्क के साथ होता है –

5

हां। शून्य किसी भी मूल्य के लिए "करीबी" नहीं है। आप बजाय BOOST_CHECK_SMALL का उपयोग कर सकते हैं।

1

@Gennadiy: शून्य किसी भी छोटे मूल्य के करीब हो सकता है। :-) सापेक्ष अंतर अपेक्षित मूल्य शून्य के बहुत करीब होने पर मनमाने ढंग से बड़े होते हैं।

यहाँ एक वैकल्पिक हल समारोह मैं इकाई परीक्षण डबल मूल्यों के लिए उपयोग करते हैं: यदि अपेक्षित मान बहुत छोटा है या शून्य तो मैं मनाया मूल्य के smallness की जाँच करें, अन्यथा मैं जाँच निकटता:

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

पाठ्यक्रम BOOST_CHECK_SMALL_OR_CLOSE मैक्रो होना बहुत अच्छा होगा जो यह स्वचालित रूप से करता है। Gennadiy शायद Boost.Test ;-)

संबंधित मुद्दे