2012-06-28 16 views
9

मैं एक JUnit परीक्षण के साथ निम्न दो डबल वस्तुओं जोर देते हुए था:JUnit अंतर

Assert.assertEquals(Double expected, Double result); 

यह था ठीक था तो मैं बदलने का फैसला किया यह आदिम डबल का उपयोग करने के लिए, जिसे तब तक बहिष्कृत किया जाता है जब तक कि आप डेल्टा भी प्रदान न करें।

तो मैं क्या सोच रहा हूं कि इस ऑब्जेक्ट में डबल ऑब्जेक्ट या आदिम प्रकार का उपयोग करने के बीच क्या अंतर है? बिना डेल्टा के ऑब्जेक्ट्स का उपयोग क्यों कर रहा है लेकिन फिर डेल्टा के बिना प्राइमेटिव का उपयोग करना बहिष्कृत किया गया है? क्या जावा पृष्ठभूमि में कुछ कर रहा है जिसमें पहले से ही एक डिफ़ॉल्ट डेल्टा मूल्य है जिसे ध्यान में रखा गया है?

धन्यवाद।

उत्तर

12

वहाँ कोई assert method in JUnit हस्ताक्षर के साथ है

assertEquals(Double expected, Double result); 

वहाँ एक, तथापि, सामान्य वस्तुओं के लिए है:

assertEquals(Object expected, Object result); 

यह वस्तुओं 'equals प्रणाली को बुलाती है और जैसा कि आप उम्मीद कर सकते हैं, यह है Double ऑब्जेक्ट्स की तुलना करने के लिए इसका उपयोग करने की अनुशंसा नहीं की जाती है।

जैसा कि आपने देखा है, युगल के लिए, फ्लोटिंग-पॉइंट राउंडिंग के साथ मुद्दों से बचने के लिए तुलनात्मक रूप से डेल्टा का उपयोग करना आवश्यक है (कुछ अन्य उत्तरों में पहले से समझाया गया है)। आप double तर्क

assertEquals(double expected, double actual, double delta); 

साथ assertEquals की 3-तर्क संस्करण का उपयोग करते हैं अपने Double रों चुपचाप double को अनबॉक्स्ड मिल जाएगा और सब कुछ ठीक काम करेंगे (और अपने परीक्षण असफल नहीं हो अप्रत्याशित रूप से :-)।इस तरह

+1

+1 फिर से अनबॉक्सिंग, हाँ, चेतावनी के साथ कि यदि एक या अन्य डबल शून्य है तो आपके पास थोड़ा अलग व्यवहार होगा। ऑब्जेक्ट के साथ, आपको डेल्टा के साथ एक अच्छा संदेश मिलेगा, आपको एक NullPointerException मिलेगा। –

+1

मेरा अनुभव यह है कि ये विधियां कुछ परिस्थितियों में बहुत बड़ी संख्या के लिए अच्छी तरह से काम नहीं करती हैं, खासकर यदि आपका डेटा परिमाण के आदेशों पर भिन्न होता है। दो संख्याओं में बहुत कम प्रतिशत त्रुटि हो सकती है, लेकिन मैच के लिए एक बड़े बड़े डेल्टा की आवश्यकता होती है। लेकिन वही डेल्टा आपके डेटा में बहुत कम मूल्यों के लिए काम नहीं करेगा। कुछ मामलों में, लगभग सभी महत्वपूर्ण अंकों से मेल खाने के लिए भी बहुत बड़ी संख्या की उम्मीद की जा सकती है। अन्य मामलों में, जैसे कि दो अनुकूलित एफएफटी एल्गोरिदम की तुलना करते समय, यह बहुत कम संभावना है। सापेक्ष त्रुटि को बाधित करने के लिए एक और मजबूत विधि है। – orodbhen

+0

@orodbhen इसे काम करने के लिए किसी को अपेक्षित मूल्य के एक्सपोनेंट पर डेल्टा बेसिंग की गणना करनी चाहिए, इसलिए यदि 'डबल ई' अपेक्षित मान है, तो डेल्टा' डबल डी = Math.pow (10, Math.log10 (Math। abs (ई)) - 12); 'जहां '12' महत्वपूर्ण अंकों की अधिकतम व्यावहारिक संख्या है। यदि आप लॉग 10 को मान <1.0 से गुणा करते हैं, तो परीक्षण बड़े सकारात्मक एक्सपोनेंट वाले 'ई' के लिए असफल हो जाएगा और इसके विपरीत, यदि आप value10 1.0 द्वारा लॉग 10 गुणा करते हैं, तो यह 'नकारात्मक' होने वाले बड़े नकारात्मक एक्सपोनेंट के लिए विफल हो जाएगा - और यह वह प्रभाव है जिसके बारे में आप लिख रहे थे। तो सुनिश्चित करें कि डेल्टा अपेक्षित मूल्य के एक्सपोनेंट के लिए उपयुक्त है। – Cromax

0

SOURCE. दावा करता है कि दो युगल या फ्लोट सकारात्मक डेल्टा के बराबर हैं। यदि वे नहीं हैं, तो एक AssertionError फेंक दिया जाता है। यदि अपेक्षित मूल्य अनंत है तो डेल्टा मान को नजरअंदाज कर दिया जाता है। एनएएन को बराबर माना जाता है।

0

मैं कहूंगा कि युगल, आदिम या वस्तु की तुलना करना, डेल्टा के बिना बेकार है। यह जानने के लिए कि संख्यात्मक काम करने के लिए प्रवाह बिंदु संख्या कैसे काम करती है।

ऑब्जेक्ट कवर के तहत .equals का उपयोग कर सकता है; आदिम के पास == के अलावा कोई विकल्प नहीं है।

सिर्फ इसलिए कि ऑब्जेक्ट संस्करण डेल्टा का उपयोग नहीं कर रहा है, यह बेहतर विचार नहीं बनाता है।

5

डबल गणित शायद ही कभी बिल्कुल बराबर परिणाम देता है। उदाहरण के लिए, 0.1 * 0.1 != 0.01। डबल-परिशुद्धता परिणामों की तुलना में आपको आमतौर पर कम से कम कुछ डेल्टा की आवश्यकता होती है।

दूसरी ओर, यदि आप Double एस बॉक्सिंग की तुलना कर रहे हैं, तो यह मानता है कि आप सटीक समानता चाहते हैं। जावा में डिफ़ॉल्ट डेल्टा मान नहीं है, लेकिन Double.equals का == से थोड़ा अलग व्यवहार है: विशेष रूप से, its handling of NaNs

यह परीक्षण में समझ में आता है, क्योंकि Double.NaN != Double.NaN, लेकिन एक परीक्षण में, यदि आपको NaN और NaN वापस लौटाया गया था, तो यह सही जवाब है।

0

बेहतर कुछ लिखने:

assertEquals(23.0, 250.0, 0.0) 

0,0 - यह डेल्टा है। पढ़ें कि आपकी विधियों को क्यों हटा दिया गया है।