2011-12-20 11 views
7

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

निम्नलिखित कोड पर विचार करें:

float factor = calculateFactor(); 
if(factor != 0.0f) 
    applyComplexAlgorithm(factor); 
+0

मैं अपने प्रश्न में एक स्वीकार्य उत्तर देने के लिए केवल उत्तर स्वीकार नहीं करता हूं, वास्तव में एक उत्तर होना चाहिए कि मुझे पूरी तरह से प्रश्न का उत्तर मिल जाए। –

उत्तर

8

यह अर्थ में सुरक्षित है कि अगर मूल्य 0.0f को स्पष्ट रूप से सेट किया जाता है, यह सच वापस आ जाएगी क्या आप वहां मौजूद हैं।

यह इस अर्थ में सुरक्षित नहीं है कि आपको यह उम्मीद नहीं करनी चाहिए कि गणना के परिणामस्वरूप मूल्य 0.0f होगा।

तो आप वास्तव में 0.0f का उपयोग एक विशेष जादू मूल्य के रूप में कर रहे हैं, शून्य के साथ वास्तविक तुलना के रूप में नहीं।

+0

ठीक है, यह एक बुरा उदाहरण था। इस मामले में, मैं वास्तव में क्या मतलब था 0.0f का उपयोग करने के लिए एक विशेष मूल्य के रूप में उपयोग करने के लिए, कुछ स्पष्ट रूप से सेट किया जाएगा। मुझे नहीं पता कि मैं इस उदाहरण के साथ क्यों आया क्योंकि यह ऐसा नहीं है जिसे मैं करने की कोशिश कर रहा हूं। –

+0

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

5

नहीं, यह सुरक्षित नहीं है, क्योंकि calculateFactor() में गणना शायद 0.0 का कारण नहीं बनेगा भी यह हिसाब से करना चाहिए के माध्यम से। एक तुच्छ उदाहरण: (0.4-0.1) -0.3 का उपयोग करते समय क्या यह अपने एल्गोरिदम के लिए इसका मतलब है 5.551115123125783e -17

3

यह निश्चित रूप से सुरक्षित है, लेकिन आप पर विचार करने के लिए क्या है में double परिणाम किया। यदि आपका एल्गोरिदम factor को विभाजक के रूप में उपयोग करता है (और विभाजित-शून्य-शून्य के लिए स्वयं की जांच नहीं करता है), तो हाँ, applyComplexAlgorithm(factor) पर कॉल करने से पहले factor != 0.0f की जांच करना पूरी तरह से उचित है।

अब, factor का उपयोग करने से पहले आपको कुछ ईपीएसलॉन से कम मूल्य की जांच करनी चाहिए या नहीं, यह आपके कोड के अनुसार पूरी तरह से है और आपके द्वारा प्रदान किए गए कोड के साथ अलगाव में निर्धारित नहीं किया जा सकता है।

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

float calculateFactor() 
{ 
    int phase = moon_phase(); 
    if (phase == FULL) { // whatever special case requires returning 0.0f 
     return 0.0f; 
    } else { 
     return 1.0 + (phase * phase); // something that is never 0.0f 
    } 
} 

float factor = calculateFactor(); 
if(factor != 0.0f) 
    applyComplexAlgorithm(factor); 
संबंधित मुद्दे