एम हमेशा = 0 क्यों है? कुछ क्लास के एक्स और वाई सदस्य पूर्णांक हैं।सी ++ इंट फ्लोट कास्टिंग
float getSlope(someClass a, someClass b)
{
float m = (a.y - b.y)/(a.x - b.x);
cout << " m = " << m << "\n";
return m;
}
एम हमेशा = 0 क्यों है? कुछ क्लास के एक्स और वाई सदस्य पूर्णांक हैं।सी ++ इंट फ्लोट कास्टिंग
float getSlope(someClass a, someClass b)
{
float m = (a.y - b.y)/(a.x - b.x);
cout << " m = " << m << "\n";
return m;
}
पूर्णांक विभाजन होता है, तो परिणाम, जो एक पूर्णांक, एक नाव के रूप में दिया जाता है। यदि परिणाम 1 से कम है तो यह 0.
के रूप में समाप्त होता है, आप अभिव्यक्तियों को विभाजित करने से पहले पहले फ़्लोट करना चाहते हैं, उदा।
float m = (float)(a.y - b.y)/(float)(a.x - b.x);
वह है एक पूर्णांक विभाजन, जिसका अर्थ है 3/4 = 0. कोष्ठक में से एक डाली
(float)(a.y - b.y)/(a.x - b.x);
अगर फ्लोट करने के लिए, (ay - - द्वारा) (bx कुल्हाड़ी) से कम है m
हमेशा शून्य है।
तो इसे इस तरह डालें।
float m = ((float)(a.y - b.y))/((float)(a.x - b.x));
क्योंकि इतने परिणाम एक पूर्णांक तो 0.
आप डाली चाहिए और अपने कोड में कास्टिंग डिवाइड ऑपरेशन के बाद किया जाता है (ay - - द्वारा) शायद कम (bx कुल्हाड़ी) है ऑपरेशन से पहले तैरने के लिए
आपको कास्ट का उपयोग करने की आवश्यकता है। मैं अन्य उत्तर देखते हैं, और वे वास्तव में काम करेंगे, लेकिन के रूप में टैग C++
है मैं आप उपयोग करना static_cast
सुझाव देंगे:
float m = static_cast< float >(a.y - b.y)/static_cast< float >(a.x - b.x);
आपको यह जानकारी होनी चाहिए कि पूर्णांकों युक्त एक अभिव्यक्ति का मूल्यांकन करने में, से अस्थायी परिणाम मूल्यांकन के प्रत्येक चरण को पूर्णांक होने के लिए भी गोल किया जाता है। float m
पर आपके असाइनमेंट में, मान केवल पूर्ण-संख्या में सक्षम float
पूर्णांक अंकगणितीय के बाद परिवर्तित किया जाता है। इसका मतलब है कि, उदाहरण के लिए, 0.0/बनने से पहले 3/4 पहले से ही "0" मान होगा। आपको पहले होने के लिए रूपांतरण को फ़्लोट करने की आवश्यकता है। तुम्हें पता है, b.y
, a.x
, b.x
, a.y - b.y
, या a.x - b.x
a.y
में से किसी पर वाक्य रचना float(value)
का उपयोग करके ऐसा कर सकते हैं: यह कोई बात नहीं, जब यह रूप में लंबे समय शर्तों में से एक एक नाव है के रूप में पहले विभाजन होता है, उदाहरण के लिए किया जाता है
float m = float(a.y - b.y)/(a.x - b.x);
float m = (float(a.y) - b.y)/(a.x - b.x);
...etc...
आप पूर्णांक पर गणना कर रहे हैं और इसके परिणाम को फ्लोट करने के लिए असाइन कर रहे हैं। तो संकलक पूरी तरह से आपके पूर्णांक परिणाम को फ्लोट
में परिवर्तित कर रहा है .. और शून्य से विभाजन के लिए देखें! – GrahamS
@ ग्राहम - यह 0 से विभाजित करना खतरनाक नहीं है, जब हम फ़्लोटिंग पॉइंट नंबरों के बारे में बात कर रहे हैं। आप किसी भी फ्लोट नंबर को 0.0 या -0.0 तक सुरक्षित रूप से विभाजित कर सकते हैं, आपको 'inf' देगा। लेकिन हाँ, अगर यह अप्रत्याशित है, तो इससे समस्याएं पैदा हो जाएंगी। –
@ किरील किरोव: हाँ, यह एक अपवाद/दुर्घटना का कारण नहीं बनता है जैसे पूर्णांक विभाजन-दर-शून्य करता है, लेकिन यह आपको '+ INF',' -INF' या 'NaN' के साथ छोड़ देता है जो शायद ओपी को आगे बढ़ाएगा जब वह 'एम' का उपयोग करने की कोशिश करता है तो समस्याएं। – GrahamS