2011-05-28 12 views
8

में चल बिन्दु स्थिरांक मैं एक टेम्पलेट समारोह एक चल बिन्दु तर्क पर काम किया है। फ़ंक्शन टेम्पलेट किया गया है ताकि एक कॉलर float, double या किसी अन्य फ़्लोटिंग पॉइंट डेटा प्रकार का उपयोग कर सके।टेम्प्लेटेड कोड

मेरी कोड में एक बिंदु पर, मैं एक (या किसी अन्य फ्लोटिंग प्वाइंट निरंतर) शून्य के साथ मूल्य की तुलना करें। क्या मुझे तुलना के लिए 0.0 या 0.0f का उपयोग करना चाहिए?

template<T> void f(T a){ 
    // should I use 0.0 or 0.0f in the following line? 
    if(a == 0.0){ 
    } 
} 

हालांकि इस समय कोई समस्या नहीं आ रही है, मैं जानना चाहता हूं कि सामान्य अभ्यास क्या है।

उत्तर

13

मेरा सुझाव था

if (a == T(0)) ... 
+0

+1। श्रेष्ठ। स्पष्ट। – Nawaz

+0

हां! यह भी है कि Std ऐसी चीजों के लिए क्या उपयोग करता है। समाधान के लिए – towi

+0

+1, लेकिन मेरी इच्छा है कि उत्तर में दूसरों की व्याख्या हो! –

7

मैं बस 0 सुझाव है। संख्यात्मक प्रकारों के लिए पदोन्नति नियमों के अनुसार, 0 फ़्लोटिंग-पॉइंट ऑपरेंड a के प्रकार पर प्रचारित किया जाएगा। स्थिरता का प्रचार एक संकलन-समय परिवर्तन है, यह आपके प्रोग्राम को धीमा नहीं करेगा।


दूसरी ओर, 0.0 का उपयोग कर दोगुना करने की है, जो शायद, एक गैर मुद्दा है के रूप में संकार्य सबसे अधिक संभावना वैसे भी एक एफपीयू रजिस्टर में पारित हो जाता है अन्य संकार्य के रन-टाइम रूपांतरण के लिए बाध्य करेगा। 0.0f फ्लोटिंग प्वाइंट ऑपरेंड के रूपांतरण का कारण नहीं है, लेकिन यदि टेम्पलेट कभी एक अभिन्न प्रकार के साथ इस्तेमाल किया गया था, तो आप float को रन-टाइम रूपांतरण प्राप्त होगी।

+0

धन्यवाद। अन्य निरंतर मूल्यों के बारे में क्या? –

+0

@ एग्नेल: गैर-अभिन्न स्थिर मूल्य? तब फ्लोटिंग-पॉइंट समानता परीक्षणों का उपयोग न करें। –

+0

आप सही हैं। मैं एक ईपीएसलॉन का उपयोग करूंगा। लेकिन तब भी सवाल बनी हुई है: क्या मैं एक फ्लोट शाब्दिक या डबल शाब्दिक का उपयोग करता हूं? –

1

आप एक सरल

if (value == 0.0) // or 0.0f, doesn't matter 

साथ चल बिन्दु संख्या पर समानता के लिए तुलना नहीं करना चाहिए, क्योंकि समय के सबसे अधिक यह परिणाम आप उम्मीद कर रहे हैं उत्पन्न नहीं करेंगे । आपको जांच करनी चाहिए कि valueपर्याप्त है जिसकी आप अपेक्षा कर रहे हैं। यह है:

if (abs(value - 0.0) < epsilon) 

जहां ईपीएसलॉन आपके लिए आवेदन डोमेन के लिए थोड़ा सा है।

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