मैं युगल indata
कहा जाता है की एक सरणी (ढेर में, malloc साथ आवंटित) के साथ काम कर रहा हूँ, और एक स्थानीय डबल sum
कहा जाता है।सी बुनियादी बातों: डबल चर डबल अभिव्यक्ति के बराबर नहीं है?
मैं indata
में मूल्यों की तुलना करने के लिए दो विभिन्न कार्यों लिखा था, और अलग परिणाम प्राप्त की। आखिरकार मैंने यह निर्धारित किया कि विसंगति एक सशर्त परीक्षण में अभिव्यक्ति का उपयोग करके एक समारोह के कारण थी, और अन्य कार्य एक ही सशर्त परीक्षण में स्थानीय चर का उपयोग कर रहा था। मुझे उम्मीद थी कि ये समकक्ष होंगे।
मेरे समारोह एक का उपयोग करता है:
if (indata[i]+indata[j] > max) hi++;
और मेरे समारोह बी का उपयोग करता है:
sum = indata[i]+indata[j];
if (sum>max) hi++;
एक ही डेटा सेट और max
अध्ययन करने के बाद मैं जो के आधार पर hi
के विभिन्न मूल्यों के साथ खत्म मैं उपयोग करता हूँ समारोह। मेरा मानना है कि फ़ंक्शन बी सही है, और फ़ंक्शन ए भ्रामक है। इसी प्रकार जब मैं
sum = indata[i]+indata[j];
if ((indata[i]+indata[j]) != sum) etc.
से नीचे स्निपेट का प्रयास करता है तो सशर्त सत्य का मूल्यांकन करेगा।
जबकि मैं समझता हूँ कि चल बिन्दु संख्या जरूरी बनाम एक चर में संग्रहीत एक सटीक प्रतिनिधित्व, क्यों कि इन-सही प्रतिनिधित्व परिवर्तन जब एक अभिव्यक्ति के रूप में मूल्यांकन करता है प्रदान नहीं करते हैं? एक सशर्त से पहले इस तरह की एक डबल अभिव्यक्ति का हमेशा मूल्यांकन करने के लिए सबसे अच्छा अभ्यास की सिफारिश की जाती है? धन्यवाद!
यह मूल रूप से है क्योंकि कंप्यूटर की कुल परिशुद्धता के साथ संख्या का प्रतिनिधित्व नहीं कर सकता है। फ़्लोटिंग पॉइंट के बारे में पढ़ें। –
@iharob उन्होंने स्वीकार किया कि उनके अंतिम अनुच्छेद में। लेकिन यह स्पष्ट नहीं करता है कि आप एक चर के परिणाम को निर्दिष्ट करते हैं या नहीं, इस पर निर्भर करता है कि यह अलग क्यों है। – Barmar
क्या यह x86 या x86-64 के लिए संकलित है? – Dolda2000