2011-09-27 8 views
6

में स्टंप हो गया है। मेरा टेस्टकेस यहाँ है।जब यह नहीं होना चाहिए, तो छोटे विफलता यूनिट टेस्टकेस

theTestArray := #(1.2 3 5.1 7). 
self assert: theTestArray squareOfAllElements = #(1.44 9 26.01 49). 

जोर देना विफल नहीं होना चाहिए। प्रत्येक तत्व के वर्ग की गणना करने पर सही है। तो मैंने "परीक्षण में कदम" किया, यह दिखाता है कि विधि squofOfAllElements और # (1.44 9 26.01 49) का परिणाम दोनों समान हैं लेकिन झूठे मूल्यांकन का दावा करते हैं। क्यूं कर? मुझसे यहां क्या गलत हो रहा है? किसी भी मदद की सराहना की है।

उत्तर

8

आप यहां फ़्लोटिंग पॉइंट नंबर से निपट रहे हैं। फ़्लोटिंग पॉइंट नंबर परिभाषा के अनुसार अचूक हैं और आपको # = का उपयोग करके उनकी तुलना कभी नहीं करना चाहिए।

जानकारी के लिए मसौदा अध्याय की धारा 1.1 जाँच चल Pharo के बिन्दु संख्या उदाहरण द्वारा पर: http://stephane.ducasse.free.fr/Web/Draft/Float.pdf

0

हालांकि, तुलना समानता संदेश, # =, संग्रह शायद #squareOfAllElements द्वारा वापस करने के लिए भेजा जाता है।

आप अपने परीक्षण बयान को फिर से लिखने के रूप में:

theTestArray := #(1.2 3 5.1 7). 
theSquaredArray := theTestArray collect: [:each | each squared]. 
theTestArray with: theSquaredArray do: [:a :b | self assert: (a equals: b) ]. 

कि पिछले वाले जैसा का परीक्षण होगा, लेकिन एक #assert चलेंगे: तत्व प्रति।

अन्य विकल्प #hasEqualElements की भिन्नता को लागू करना होगा: फ्लोट के संदर्भ में # # बराबर: # = के बजाय।

0

जैसा कि अन्य उत्तरों में कहा गया है, फ्लोट अचूक है। यह भी याद रखें कि विजुअलवर्क्स एकल परिशुद्धता (लगभग 7 दशमलव स्थानों) के लिए डिफ़ॉल्ट रूप से फ़्लोट करते हैं, यदि आप अपने फ्लोट नंबर को अक्षर डी के साथ पॉफिक्स करते हैं, जैसे 5.1 डी आपको डबल सटीक (लगभग 15 दशमलव स्थान) मिलेगा, कम अचूक, लेकिन अभी भी निष्क्रिय है।

भ्रम का एक अतिरिक्त स्रोत यह है कि दो अलग फ़्लोट विजुअलवर्क्स में अनुमानित दशमलव प्रतिनिधित्व के साथ प्रिंट कर सकते हैं।

5.1 squared printString 
-> '26.01' 

लेकिन

5.1 squared = 26.01 
-> false 

ध्यान दें कि हाल ही में स्क्वीक या Pharo प्रिंट सिर्फ पर्याप्त दशमलव के विभिन्न फ्लोट भेद करने के लिए (और उन्हें अपरिवर्तित पुनर्व्याख्या)

5.1 squared 
->26.009999999999998 

वैकल्पिक रूप से, आप उपयोग कर सकते हैं तथाकथित सटीक परिचालन करने के लिए फिक्स्डपॉइंट (विजुअलवर्क्स, या स्केल्डडिसीमल में अन्य स्वाद):

theTestArray := #(1.2s 3 5.1s 7). 
self assert: theTestArray squareOfAllElements = #(1.44s 9 26.01s 49). 

इस अन्य जाल से भी सावधान रहें: एक फिक्स्डपॉइंट (स्केलडडिमेमल) केवल अंश बिंदु के बाद कई दशमलव मुद्रित करता है, लेकिन आंतरिक रूप से यह अधिक (असीमित कई) पकड़ सकता है।

5.1s1 squared printString 
-> '26.0s1' 

लेकिन

5.1s1 squared = 26.01s2 
-> true 
संबंधित मुद्दे