2009-11-23 11 views
13

में डबल परिशुद्धता पर विचार करें:'sprintf': सी

double a = 0.0000005l; 
char aa[50]; 
sprintf(aa, "%lf", a); 
printf("%s", aa); 

Output: s0.000000 

ऊपर कोड स्निपेट में, चर aa केवल छह दशमलव परिशुद्धता हो सकते हैं। मैं "s0.0000005" जैसे आउटपुट प्राप्त करना चाहता हूं। मुझे यह कैसे हासिल होगा?

+2

एफवाईआई, 0.0000005 एल एक "लंबा डबल" है, जो कि लगातार डबल टाइप के लिए 0.0000005 का उपयोग करता है। – progrmr

+0

पहले ही उत्तर दिया गया है: http://stackoverflow.com/questions/69743/how-to-use-f-to-populate-a-double-value-into-a-string-with-the-right-precision – progrmr

उत्तर

22

अपने प्रश्न से ऐसा लगता है जैसे आप, C99 उपयोग कर रहे हैं के रूप में आप डबल के लिए %lf इस्तेमाल किया है।

प्राप्त करने के लिए वांछित आउटपुट की जगह:

sprintf(aa, "%lf", a); 

साथ
sprintf(aa, "%0.7f", a); 

सामान्य वाक्य रचना "%A.B" दशमलव बिंदु के बाद बी अंकों का उपयोग करना होता है। A का अर्थ अधिक जटिल है, लेकिन here के बारे में पढ़ा जा सकता है।

+9

'"% एबी "' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 'ए' _" फ़ील्ड चौड़ाई "_ है। यह पूरे मुद्रित संख्या की न्यूनतम वर्ण चौड़ाई है। आवश्यकतानुसार आउटपुट को रिक्त स्थान (डिफ़ॉल्ट रूप से) के साथ गद्देदार किया जाता है। – chux

+1

मुझे यकीन नहीं है कि यह उत्तर 'lf' से' f' में स्विच करने का सुझाव क्यों देता है। 'एलएफ'' डबल' के लिए एक बिल्कुल उपयुक्त प्रारूप विनिर्देशक है। इसके अलावा, इसे सी 99 में विशेष रूप से 'fscanf' और 'fprintf' में प्रारूप विनिर्देशों के बीच कष्टप्रद असंगतता से ठीक करने के लिए वैध बनाया गया था।जिसका अर्थ है कि 'डबल' मानों के लिए 'lf' को' f' से अधिक * पसंदीदा * होना चाहिए। 'एफ'' फ्लोट 'के लिए है। – AnT

5

आप प्रारूप कोड पर कुछ अधिक जानकारी के लिए की तरह sprintf(aa, "%9.7lf", a)

चेक बाहर http://en.wikipedia.org/wiki/Printf इसे लिखने की जरूरत है।

+2

% lf लंबे समय के लिए है। एक डबल के लिए% 9.7 एफ का उपयोग किया जाना चाहिए। – progrmr

+2

@ kk6yb: '% lf' C89 के लिए अपरिभाषित है, और C99 के लिए'% f' जैसा ही है (जहां दोनों 'डबल' मान मुद्रित करने के लिए अच्छे हैं)। लंबे समय तक, सही रूपांतरण विनिर्देशक '% Lf' है। – pmg

+1

अधिक सटीक रूप से, '% X.Yf' में 'Y' दशमलव प्रदर्शित करने के बाद स्थानों की संख्या का प्रतिनिधित्व करता है (डिफ़ॉल्ट 6 है) और 'एक्स' प्रदर्शित करने के लिए वर्णों की न्यूनतम संख्या का प्रतिनिधित्व करता है। आपके मामले में 'X' आवश्यक नहीं है, लेकिन आपको' .Y' जोड़ना होगा जहां 'Y' प्रिंट करने के लिए दशमलव स्थानों की संख्या है। – bta

-1

समस्या sprintf साथ

sprintf(aa,"%lf",a); 

% वामो "एक" एक "डबल" (8 बाइट्स) यह वास्तव में है के रूप में एक "लंबे समय डबल" (16 बाइट्स) लेकिन दर्शाने के लिए कहते हैं। बजाय इस का उपयोग करें:

sprintf(aa, "%f", a); 

अधिक जानकारी here on cplusplus.com

+1

'% lf' C89 के लिए अपरिभाषित है, और C99 के लिए'% f' जैसा ही है। लंबे समय तक, सही रूपांतरण विनिर्देशक '% Lf' है। – pmg

+0

वह 6 दशमलव स्थानों को मुद्रित करेगा - इसलिए यह 0.000001 की बजाय 0.000000 प्रिंट करेगा। "दशमलव 9.7 एफ" का प्रयोग 7 दशमलव स्थानों के लिए सही है। –

+0

हम्म, हाँ, मैंने दशमलव स्थानों पर ध्यान नहीं दिया। प्वाइंट यह है कि '% lf' को सी 99 में' डबल' की उम्मीद है; '% एलएफ' 'लंबी डबल' की अपेक्षा करता है। – pmg

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