2012-12-01 23 views
14

क्या एक फ़्लोटिंग-पॉइंट डेटा प्रकार (उदा। double) की उपस्थिति सुनिश्चित करती है कि सभी +, -, *, /,%, आदि गणित परिचालन डबल ऑपरेंड मानते हैं?क्या एक समीकरण में प्रत्येक int को डबल करने के लिए डबल करता है?

यदि कहानी उससे अधिक जटिल है, तो क्या कोई संसाधन है जो इन नियमों का वर्णन करता है? क्या मुझे ऐसे प्रश्न नहीं पूछना चाहिए और समीकरण का परिणाम double होने पर हमेशा int से double पर स्पष्ट रूप से डालना चाहिए। यहां कुछ समीकरण हैं जिनके बारे में मैं सोच रहा हूं। मैंने उद्देश्यपूर्वक संकलन और मेरे सिस्टम पर तब तक नहीं चलाया, क्योंकि यह ऐसी चीज है जो संकलक निर्भर हो सकती है।

int a(1), b(2), c(3); 
double d(4.); 
double result1 = a + b/d + c; // equal to 4 or to 4.5? 
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?  
double result3 = a/b + d; // equal to 4 or to 4.5? 
+2

संचालन के आदेश पर विचार करें। यदि आवश्यक हो तो प्रत्येक ऑपरेशन प्रचारित होगा। – JCooper

+0

समझ गया, इसलिए प्रत्येक ऑपरेशन में दो ऑपरेंड होते हैं (अधिकांश भाग के लिए) और यदि कोई 'फ्लोट' है और दूसरा 'int' है, तो 'int' को फ़्लोट करने के लिए प्रचारित किया जाता है। –

+2

@LexFridman हां, ऐसा कुछ। –

उत्तर

27

मैंने उद्देश्य से संकलन और मेरे सिस्टम पर तब तक भाग नहीं लिया, क्योंकि यह ऐसी चीज है जो संकलक निर्भर हो सकती है।

यह संकलक निर्भर नहीं है। सी ++ स्पष्ट रूप से order of these operations को परिभाषित करता है और वे कैसे परिवर्तित होते हैं।

रूपांतरण कैसे होता है संचालन के क्रम पर निर्भर करता है।

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

इस उदाहरण में, विभाजन पहले होता है। चूंकि यह एक डबल से विभाजित एक int है, इसलिए कंपाइलर int को एक डबल में परिवर्तित करके संभालता है। इस प्रकार, b/d का परिणाम एक डबल है।

अगली बात यह है कि सी ++ करता है b/d के परिणामस्वरूप a जोड़ता है। यह एक डबल में जोड़ा गया एक int है, इसलिए यह int को एक डबल में जोड़ता है और जोड़ता है, जिसके परिणामस्वरूप एक डबल होता है। c के साथ एक ही बात होती है।

double result3 = a/b + d; // equal to 4 or to 4.5? 

इस उदाहरण में, विभाजन को पहले संभाला जाता है। a और b दोनों चींटियां हैं, इसलिए कोई रूपांतरण नहीं किया जाता है। a/b का परिणाम टाइप int है और 0.

फिर, इसका परिणाम d में जोड़ा गया है। यह एक int प्लस एक डबल है, इसलिए सी ++ int को एक डबल में परिवर्तित करता है, और परिणाम एक डबल होता है।

हालांकि इस अभिव्यक्ति में एक डबल मौजूद है, a/b का मूल्यांकन पहले किया जाता है, और डबल का मतलब कुछ भी नहीं होता है जब तक कि निष्पादन डबल तक नहीं पहुंच जाता। इसलिए, पूर्णांक विभाजन होता है।

मुझे पदोन्नति और रूपांतरण नियम बहुत जटिल लगता है। आम तौर पर पूर्णांक-जैसी संख्याएं (लघु, int, long) को फ़्लोटिंग-पॉइंट समकक्षों (फ्लोट, डबल) में प्रचारित किया जाता है। लेकिन चीजें आकार अंतर और संकेत से जटिल हैं।

रूपांतरण के बारे में विशिष्टताओं के लिए this question देखें।

8

एक doubledouble के समीकरण में हर int को बढ़ावा देने के करता है?

नं। केवल एक ही ऑपरेशन का परिणाम (प्राथमिकता के संबंध में)।

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

4.5।

double result2 = (a + b)/d + c; // equal to 3 or to 3.75? 

3.75।

double result3 = a/b + d; // equal to 4 or to 4.5? 

4.

1

आम तौर पर, एक द्विआधारी ऑपरेटर में से एक संकार्य तैर रहा है बिंदु और अन्य पूर्णांक है अगर, पूर्णांक चल बिन्दु में बदल जाती है, और परिणाम चल रहा है बिंदु।

एक मिश्रित अभिव्यक्ति में, एकाधिक उप-अभिव्यक्तियों के साथ, प्रत्येक ऑपरेटर को प्राथमिकता नियमों का उपयोग करके व्यक्तिगत रूप से संसाधित किया जाता है, जिसे आप शायद जानते हैं। इस प्रकार, a*b + c*d में, a*b का मूल्यांकन किया गया है, और c*d का मूल्यांकन किया गया है, और परिणाम एक साथ जोड़े गए हैं। c*d में जो कुछ भी है a*b और इसके विपरीत में कोई प्रभाव नहीं पड़ता है।

सी ++ जटिल है, निश्चित रूप से, और उपयोगकर्ता परिभाषित ऑपरेटरों के अन्य व्यवहार हो सकते हैं।

नियमों को परिभाषित करने वाला आधिकारिक संसाधन सी ++ मानक है। मानक काफी बड़ा और तकनीकी है। आप पहले सी मानक की जांच करना पसंद कर सकते हैं। मानकों के लिंक के लिए this answer देखें। सी या सी ++ पर किसी भी अच्छी किताब को डिफ़ॉल्ट प्रकार के रूपांतरण और अभिव्यक्ति मूल्यांकन का वर्णन करना चाहिए।

2

आप हर ऑपरेटर की पूर्वता पर विचार करना चाहिए, तो आप एक पार्सर की तरह सोचना चाहिए:

double result1 = a + b/d + c; // equal to 4 or to 4.5? 

कि तरह एक + (ख/डी) है + स क्योंकि '/' ऑपरेटर सबसे बड़ी precedence.Then है इससे कोई फर्क नहीं पड़ता कि इनमें से 2 ऑपरेशन पहले के लिए किए गए हैं, क्योंकि फ्लोटिंग पॉइंट ऑपरेंड मध्य में है, और यह अन्य ऑपरेटरों को "संक्रमित" करता है और उन्हें डबल बनाता है। तो यह 4.5 है।

double result2 = (a + b)/d + c; // equal to 3 or to 3.75? 

यहाँ एक ही है, यह की तरह है ((ए + बी)/डी) + स, तो ए + बी 3 है, कि 3, क्योंकि दोगुना करने के लिए प्रोत्साहित किया जाता है एक चल बिन्दु संख्या हो जाता है क्योंकि घ के लाभांश है , जो एक डबल है, इसलिए यह 0.75 + 3 है, जो 3.75 है।

double result3 = a/b + d; // equal to 4 or to 4.5? 

ऐसा लगता है कि (क/ख) + डी, तो एक/b शून्य है और घ 4 है, इसलिए इसे 4. एक पार्सर श्रेष्ठता के क्रम में सभी कार्यों को बनाता है, ताकि आप वास्तव में पता कर सकते हैं अभिव्यक्ति का परिणाम होगा।

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