2012-10-31 26 views
5

देता है जब मैं 1/60 या 1/(60 * 60) को विभाजित करने का प्रयास करता हूं तो यह 0 देता है। यहां तक ​​कि डीबगर विंडो में भी। मैं थोड़ा उलझन में हूं कि यह क्या हो सकता है, क्योंकि 2/3 या 2.5/6 परिणाम देते हैं।सी ++। किसी भी संख्या से 1 को विभाजित करना 0

मेरे कोड:

int main() 
{ 
    double k1 = 1/60; 
    cout << k1 
     << endl; 
    double k2 = 1/(60*60); 
    cout << k2 
     << endl; 

    return 0; 
} 

मैं तुम्हारी मदद की सराहना करते हैं।

+18

पूर्णांक छंटनी के लिए हैलो कहें। – chris

+0

@ क्रिस: इतनी जल्दी! – Yamaneko

+2

@ विक्टरहुगो, शीर्षक प्रकार ने इसे दिया। बेशक इसका मतलब यह है कि यह एक बेहद अच्छा खिताब है। – chris

उत्तर

9

चूंकि आपके दोनों ऑपरेंड पूर्णांक हैं, इसलिए संकलक एक पूर्णांक विभाजन (जो नहीं करता है दशमलव भाग की गणना करें)। यदि कम से कम एक ऑपरेटिंग एक फ़्लोटिंग पॉइंट प्रकार है (जैसा कि आपके अन्य उदाहरणों में है) तो दूसरे को पदोन्नत किया जाता है और एक फ़्लोटिंग पॉइंट डिवीजन किया जाता है।

ठीक

मेक कम से कम एक चल बिन्दु प्रकार (double या float) की ऑपरेंड में से एक; यह एक double शाब्दिक (60, पूर्णांक है 60.0 या यहाँ तक कि 60.double है, 60.ffloat है) आप इस उदा .:

  • कर बना सकते हैं
  • एक डाली (double(60), (double)60) का उपयोग कर।

व्यक्तिगत तौर पर मैं सीधे double शाब्दिक का उपयोग करना पसंद - डाली आधे रास्ते सभ्य compilers पर किसी भी प्रदर्शन की सजा है नहीं कि है, लेकिन यह "गलत" और सिर्फ सही प्रकार की एक शाब्दिक का उपयोग करने के संबंध में अत्यधिक शब्द लगता है।

आम आपत्तियों

  • "लेकिन मैं इसे एक double को बताए कर रहा हूँ (जाहिर है जब दोनों ऑपरेंड चर रहे हैं और शाब्दिक नहीं आप कलाकारों का उपयोग करने के है )! "

    कई newbies, इस तथ्य से उलझन में हैं क्योंकि वे लगता है कि परिणाम बताए एक double को संकलक करने के लिए संकेत के कुछ प्रकार होना चाहिए रहे हैं। वास्तव में, यह नहीं है।

    अभिव्यक्ति में किए गए गणना/प्रचार गंतव्य के प्रकार से पूरी तरह से स्वतंत्र हैं, जो कि अंतिम चरण है। परिणाम का उपयोग कैसे किया जाएगा इसके संबंध में उप-अभिव्यक्तियों का मूल्यांकन किया जाता है, इसलिए सभी प्रकार के प्रचार/संचालन केवल ऑपरेटरों के प्रकार से ही निर्भर होते हैं।

  • क्यों एक पूर्णांक विभाजन चाहते हैं?

    कई भाषाओं स्वचालित रूप से फ़्लोटिंग पॉइंट डिवीजन निष्पादित करते हैं, भले ही तर्क दोनों पूर्णांक (उदा। वीबी 6, आईआईआरसी) होते हैं, क्योंकि यह नौसिखियों के लिए अधिक सहज महसूस करता है। ऐसा नहीं है कि सी/सी ++ में: विभाजन पूर्णांक होता है जब तर्क पूर्णांक होते हैं, क्योंकि कई मामलों में आपको केवल दशमलव के बारे में परवाह नहीं है, और/या प्रदर्शन कारणों से यह बेहतर है कि एफपीयू (पृष्ठभूमि दर्शन का उपयोग न करें) सी और सी ++ में "आप जो भी उपयोग नहीं करते हैं उसके लिए आप भुगतान नहीं करते हैं")।

    स्पष्ट रूप से समस्या को अभिन्न विभाजन के लिए एक अलग ऑपरेटर का उपयोग करके संबोधित किया जा सकता था (वीबी, फिर, \ का उपयोग करता है), लेकिन आईएमएचओ हमारे पास सी ++ में पर्याप्त ऑपरेटर हैं। :)


  1. Nitpickers 'कोने: हाँ, यहाँ वास्तव में यह एक प्रारंभ, नहीं एक काम है, लेकिन हम गलत धारणा है उसी तरह की बात कर रहे हैं।
  2. ए "शाब्दिक" स्रोत कोड में शामिल एक मान है।
1

denominator भी दशमलव संख्या होना चाहिए।

double k1 = 1/60.0; //Should work 

अन्यथा आपका कार्यक्रम अनिवार्य रूप से सभी दशमलवों को छोटा कर देगा।

थोड़ा अतिरिक्त: जब आपके हर एक चर रहा है, तो आप इसे कास्ट करने के लिए है:

double k2 = 1/(double)myDenom; 
+0

कम से कम एक संख्या या denominator एक फ़्लोटिंग-पॉइंट प्रकार होना चाहिए। यह denominator नहीं होना चाहिए: '1.0/60' ठीक काम करता है, भी। –

+0

ओह मैं कसम खाता हूँ कि यह denominator होना था। वैसे भी मुझे कॉलेज साल पहले भी याद है। –

2

लाइन double k1 = 1/60 एक संकलन समय निरंतर रूप में संकलक द्वारा मूल्यांकन किया जाएगा। चूंकि संख्या के अंत में 0 '0 'नहीं है, 1/60 का पूर्णांक विभाजन के माध्यम से मूल्यांकन किया जाएगा, और इसलिए 0.