2011-06-30 8 views
6

सी प्रोग्रामिंग भाषा में, फ्लोटिंग पॉइंट निरंतर डिफ़ॉल्ट रूप से डबल प्रकार
है इसलिए 3.1415 डबल प्रकार है, जब तक कि फ्लोट प्रकार को इंगित करने के लिए 'f' या 'F' प्रत्यय का उपयोग न करें।सी में चेतावनी के बिना चर स्थिर करने के लिए डबल स्थिर असाइन करें?

मुझे लगता है कि const float pi = 3.1415 चेतावनी देगा, लेकिन वास्तव में नहीं।

जब मैं -Wall साथ जीसीसी के तहत इन की कोशिश:

float f = 3.1415926; 
double d = 3.1415926; 
printf("f: %f\n", f); 
printf("d: %f\n", d); 
f = 3.1415926f; 
printf("f: %f\n", f); 
int i = 3.1415926; 
printf("i: %d\n", i); 

परिणाम है:

f: 3.141593 
d: 3.141593 
f: 3.141593 
i: 3 

परिणाम (डबल चर सहित) स्पष्ट रूप से सटीक खो देते हैं, लेकिन बिना किसी चेतावनी के संकलन।
तो कंपाइलर ने इसके साथ क्या किया? या मैंने कुछ गलत समझा?

उत्तर

7

-Wall आदि परिशुद्धता की हानि, मूल्यों की काट-छांट, के बारे में चेतावनी सक्षम नहीं है क्योंकि इन चेतावनियों हैं कष्टप्रद शोर और "फिक्सिंग" उन्हें बदसूरत जानवरों के ढेर के साथ सही कोड को अव्यवस्थित करने की आवश्यकता होती है। अगर आप इस प्रकृति की चेतावनियां चाहते हैं तो आपको उन्हें स्पष्ट रूप से सक्षम करने की आवश्यकता है।

इसके अलावा, printf के आपके उपयोग के वास्तविक चर के परिशुद्धता के साथ कुछ लेना देना नहीं है, केवल सटीक printf पर प्रिंट कर रहा है, जो दशमलव बिंदु के बाद 6 स्थानों पर डिफ़ॉल्ट है।

+0

की 'printf' सुनिश्चित करता है तैरता परोक्ष जब पारित कर दिया युगल के लिए डाले गए variadic प्रकृति? –

+0

हां, हालांकि यह ओपी के सवाल से असंबंधित है। –

+0

मुझे आश्चर्य है कि जो अधिक से अधिक है: गलतियों जो "डबल से परिशुद्धता की संभावित हानि फ्लोट करने के लिए" संदेशों को पकड़ने, या कि परिणाम गलतियों की संख्या जब कोड एक प्रोग्रामर है जो स्पष्ट रूप से 'float' के लिए चीजों के बहुत सारे बलों को बनाने के लिए की संख्या कंपाइलर खुश है, कुछ भी 'फ्लोट' करने के लिए मजबूर करता है जो नहीं होना चाहिए [उदाहरण के लिए 'कॉन्स फ्लोट एक दसवां = 1.0 एफ/10.0 एफ; फ्लोट वैल्यू 1 = 8.0 एफ * दसवां; डबल वैल्यू 2 = 4.0 एफ * दसवां; 'ध्यान दें कि यदि 'दसवां'' डबल 'हो सकता था, तो सबकुछ पूरी तरह से काम करता। – supercat

2

%ffloat और double के साथ उपयोग किया जा सकता है। आप और अधिक सटीक उपयोग चाहते

printf("f: %.16f",d); 

और यही हुड के नीचे हो रहा है यह है:

float f = 3.1415926; // The double 3.1415926 is truncated to float 
double d = 3.1415926; 
printf("f: %f\n", f); 
printf("d: %f\n", d); 
f = 3.1415926f;  // Float is specified 
printf("f: %f\n", f); 
int i = 3.1415926; // Truncation from double to int 
printf("i: %d\n", i); 
+0

क्या यह डबल के लिए '% lf' नहीं होना चाहिए? –

+3

@sharth: 'lf' और' 'f' scanf' के लिए अलग लेकिन में ही कर रहे हैं' printf' – Jacob

1

आप इस के लिए चेतावनी प्राप्त करना चाहते हैं, मुझे विश्वास है कि मुख्य लाइन जीसीसी-4.3 और उच्चतर में -Wconversion झंडे उन्हें।

आप ओएस एक्स का उपयोग करने होते हैं तो -Wshorten-64-to-32 जीसीसी-4.0.1 के बाद से एप्पल के जीसीसी में उन्हें फ़्लैगिंग किया गया है। मेरा मानना ​​है कि क्लैंग मुख्य लाइन जीसीसी व्यवहार से मेल खाता है।

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