2011-08-25 12 views
6

सी ++: प्रारूप float के लिए प्रारूप spec क्या है? (दृश्य सी ++)सी ++: "फ्लोट" के लिए printf() प्रारूप spec क्या है?

ऐसा लगता था कि और %lgdouble के लिए मैंने %g का उपयोग किया था।

ऐसा लगता है कि spec बदल गया है और float अपरिभाषित है और double%g है।

मेरे पास स्मृति में बिट्स हैं जो मैं प्रिंट कर रहा हूं इसलिए कास्टिंग एक विकल्प नहीं है।

क्या कोई तरीका है कि मैं मान printf() का उपयोग कर मुद्रित कर सकता हूं?

अद्यतन:

इस कोड को इकाई का परीक्षण सामान्य सी ++ एक एम्बेडेड सिस्टम पर इस्तेमाल किया libs के लिए लिखा गया था। यहाँ मैं float काम करने के लिए प्राप्त करने के लिए करना था क्या। कोड एक टेम्पलेट समारोह में है:

if (typeid(Ttyp) == typeid(float)) {  
    float64 c = *(float32*)&Tp(row,col); 
    float64 a1 = *(float32*)&Arg1(row,col); 
    float64 a2 = *(float32*)&Arg2(row,col); 
    float64 e = *(float32*)&Exp(row,col); 
    m_b = (c == e); 
    _snprintf(m_acDiag, sizeof(m_acDiag)-1 
     , "add(Arg1,Arg2): arg1=%g, arg2=%g, Expected=%g, Actual=%g, Result: %s" 
     , a1, a2, e, c, BOOL_PF(m_b)); 
} else { 
    ... 

सुंदर बदसूरत है ना:

template <typename T,typename TTYP,typename Ttyp,int bits,bool IsSigned> 
Error testMatrixT() 
{ ... 

यहाँ एक कोड स्निप है? तर्क के रूप में फ्लोट का उपयोग खराब आउटपुट देते हैं। शायद _snprintf() का उपयोग करने के कारण? साल पहले मैं %lg का उपयोग करता हूं और यह ठीक होगा। अब और नहीं।

+1

यह एक तीसरा या चौथा प्रश्न है जिसे मैंने देखा है, कई दिनों में, एक फ्लोट प्रिंट करने के बारे में! – Praetorian

+0

आपने उल्लेख नहीं किया कि यदि आप% g का उपयोग करते हैं तो क्या होता है। लेकिन वैसे भी% g फ्लोट के लिए डिफ़ॉल्ट नहीं है। – steve

+1

@steve: '% g' फ्लोट के लिए काम करता है, क्योंकि इसे दोहराया जाता है। –

उत्तर

16

डबल और नाव printf साथ ही स्वरूप विनिर्देशक का उपयोग करें (%a , %e, %f, और %g)। ऐसा इसलिए है क्योंकि printf एक विविध कार्य है। किसी भी फ्लोट तर्क को कॉल से पहले दोहराया जाता है; आप वास्तव में printf पर एक फ्लोट पास नहीं कर सकते हैं।

1
printf("float: %f", floatValue); 

या यदि आप घातीय संकेतन हैं:

printf("float: %e", floatValue); 
+0

या यदि आप या तो निश्चित बिंदु या घातीय चाहते हैं: 'printf (" float:% g ", floatValue);' –

4
शीर्षक में सवाल करने के लिए

: कोई नहीं/"% च"

संदेश के मुख्य भाग में प्रश्न करने के लिए

है: हां और नहीं।

printf एक विविध कार्य है। सभी float तर्क स्वचालित रूप से double पर प्रचारित किए जाते हैं। आप इसे printf को पास करके एक नाव प्रिंट, लेकिन कोई नाव वास्तव में printf समारोह तक पहुँचता है।

1

दूसरों मुद्रण printf का उपयोग कर नाव के लिए प्रारूप ने बताया है, लेकिन, जब से तुम सी ++ का उपयोग कर रहे है, मेरे सुझाव यह पूरी तरह से बचना है।

उपयोग सी ++ धाराओं बजाय, आप प्रारूप विनिर्देशक के बारे में तो चिंता करने की जरूरत नहीं है। यह भी सुरक्षित स्पर्श करके रखें printf नहीं है।

#include <iostream> 

int main() 
{ 
    float f = 1.234; 
    std::cout << f << std::endl; 
} 

आप एक नाव चर में एक नाव, memcpy युक्त यह बाइट्स की एक सरणी है और इसके बाद के संस्करण कोड का उपयोग करते हैं।

+0

मैं स्ट्रीम का उपयोग करके समाप्त हुआ, लेकिन मुझे लगता है कि यह एक अस्थायी समाधान है क्योंकि मुझे यकीन है कि हम अंततः इसे चलाएंगे एसटीएल समर्थन के बिना एक एम्बेडेड मंच पर। मुझे लगता है कि फ्लोट को हटा दिया गया है क्योंकि इसके लिए प्रारूप प्रारूप नहीं है और यह प्रिंटफ के लिए एक तर्क के रूप में काम नहीं करता है जब तक कि मैं इसे दो बार नहीं डालता। –

1

%g या तो फ्लोट या डबल के लिए हमेशा सही प्रारूप रहा है (क्योंकि फ्लोट तर्क printf जैसे विविध कार्यों के लिए डबल पर प्रचारित हैं)।

%lg%g (सी 99 में, मुझे नहीं पता कि सी ++ इसे अपनाया गया है या नहीं) के लिए समानार्थी के रूप में जोड़ा गया था, शायद *scanf परिवार के साथ बेहतर समरूपता के लिए।

$Lg लंबे समय तक डबल है।

आप आउटपुट प्रारूप के आधार पर उपरोक्त में f या e के साथ g को प्रतिस्थापित कर सकते हैं।

+0

कई प्रणालियों पर सी ++ सी के समान रनटाइम का उपयोग करता है, इसलिए यदि सी पुस्तकालय सी 99 मानक का उपयोग करता है, तो सी ++ करता है। – user877329

+0

@ user877329: सच है - लेकिन अभी भी सी पुस्तकालय हैं जो सी 99 का समर्थन नहीं करते हैं (उदाहरण के लिए, यदि मुझे गलत नहीं है)। –

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