C++

2010-12-06 9 views
8

में पूर्णांकों कास्टिंग के बारे में एक साधारण सवाल मैं निम्नलिखित बहुत ही सरल कोड है -C++

int x=15000 
int z=0.7*x 
cout<<"z = "<<z<<endl; 

मैं आउटपुट प्राप्त

z=10499 

लेकिन अगर मैं इसे

int z=0.7*15000 
cout<<"z = "<<z<<endl; 

करने के लिए बदल आउटपुट

z=10500 

मुझे समझ में आता है कि इसका परिणाम जे 0 के साथ कुछ पर कास्टिंग कर रहा है लेकिन यह दोनों मामलों में अलग क्यों है?

धन्यवाद,

संपादित करें - मैं ubuntu के 10.10 जीसीसी का निर्माण का उपयोग कर रहा

+0

मेरे पास 10500 (जीसीसी 4.2) है ... आप किस कंपाइलर का उपयोग कर रहे हैं? क्या यह वास्तव में आपके पास कोड है? – Vladimir

उत्तर

4

पूर्णांक z = 0.7 * x;

डबल-परिशुद्धता मान 0.7 बिल्कुल फ़्लोटिंग-पॉइंट नंबर के रूप में प्रस्तुत नहीं है; अधिकांश मशीनों पर इसका हेक्स प्रतिनिधित्व 3fe6666666666666 है, जो वास्तविक मूल्य 3fe6666666666666 से कम है ... इसलिए 0.7 * x का डबल-परिशुद्धता परिणाम इसके वास्तविक मूल्य से कम है, और गोलाकार है। यह सही व्यवहार है।

int z = 0.7 * 15000;

दूसरी ओर, संकलक यह देखने के लिए पर्याप्त है कि 0.7 * 15000 7 * 1500 = 10500 के रूप में बिल्कुल प्रतिनिधित्व योग्य है। इसलिए यह परिणाम के बजाय सही परिणाम का उपयोग करता है जो अभिव्यक्ति को संकलित करके प्राप्त किया जाएगा और इसे निष्पादित करना।

6

मैं इसे संकलक, कि संकलन समय पर अंकगणितीय अभिव्यक्ति को सरल की वजह से लगता है।

पहली अभिव्यक्ति की गणना एफपीयू (परिमित परिशुद्धता के साथ), और दूसरा: प्रीप्रोसेसर ("अनंत" परिशुद्धता के साथ) द्वारा की गई थी। रिलीज मोड में प्रोग्राम चलाने का प्रयास करें (या -O2 के साथ), परिणाम दोनों अभिव्यक्तियों के लिए समान होना चाहिए।

3

मुझे लगता है कि रुस्लिक के पास आपके प्रश्न का सही उत्तर है।

मैं बस जोड़ता हूं: हमेशा अपनी गणना को अंतिम क्षण तक या तो फ्लोट या डबल में रखें। इस तरह आप परिशुद्धता खोना नहीं है।

इस के लिए अपने कोड को बदलने का प्रयास करें:

double z = 0.7 * 15000.0; 
cout<<"z = "<<z<<endl; // Will need to include some formatting 

या

int z = (int) (0.7 * 15000.0); 
cout<<"z = "<<z<<endl; 
+1

ये दोनों सुझाव नो-ऑप्स हैं, और समस्या को हल करने के लिए कुछ भी नहीं करते हैं। – TonyK

+0

समस्या यह है कि 0.7 * x 0.7 * 15000 के लिए एक अलग परिणाम देता है। नीचे/ऊपर मेरा जवाब देखें। – TonyK

+1

मुझे लगता है कि यह अच्छी सलाह है। यदि आपको डबल परिशुद्धता की आवश्यकता है तो अपने चर को युगल में रखें। यदि आवश्यक हो तो अंतिम चरण के रूप में गोलाकार का प्रयोग करें। –