मैं doubleपूर्ण सटीकता के साथ cout का उपयोग करके एक मूल्य कैसे प्रिंट करूं ?
सटीक का
उपयोग करें hexfloatया
उपयोग करें scientificऔर सेट करें
std::cout.precision(std::numeric_limits<double>::max_digits10 - 1);
std::cout << std::scientific << 1.0/7.0 << '\n';
// C++11 Typical output
1.4285714285714285e-01
बहुत सारे उत्तर केवल 1 में से एक) आधार 2) को निर्धारित / वैज्ञानिक लेआउट या 3) परिशुद्धता से संबोधित करते हैं। परिशुद्धता के साथ बहुत से उत्तर आवश्यक उचित मूल्य प्रदान नहीं करते हैं। इसलिए यह एक पुराने प्रश्न का उत्तर है।
- क्या आधार है?
A doubleनिश्चित रूप से आधार का उपयोग कर एन्कोड किया गया है। C ++ 11 के साथ एक सीधा दृष्टिकोण का उपयोग करके प्रिंट करना है std::hexfloat।
यदि एक गैर-दशमलव आउटपुट स्वीकार्य है, तो हम किए जाते हैं।
std::cout << "hexfloat: " << std::hexfloat << exp (-100) << '\n';
std::cout << "hexfloat: " << std::hexfloat << exp (+100) << '\n';
// output
hexfloat: 0x1.a8c1f14e2af5dp-145
hexfloat: 0x1.3494a9b171bf5p+144
- अन्यथा:
fixedया scientific?
A doubleएक फ्लोटिंग पॉइंट प्रकार है, फिक्स्ड पॉइंट नहीं है ।
करो नहीं का उपयोग std::fixedकि के रूप में छोटे मुद्रित करने के लिए विफल रहता है doubleकुछ भी लेकिन के रूप में 0.000...000। बड़े के लिए double, यह कई अंकों को प्रिंट करता है, शायद सैकड़ों संदिग्ध सूचनात्मकता।
std::cout << "std::fixed: " << std::fixed << exp (-100) << '\n';
std::cout << "std::fixed: " << std::fixed << exp (+100) << '\n';
// output
std::fixed: 0.000000
std::fixed: 26881171418161356094253400435962903554686976.000000
पूर्ण परिशुद्धता के साथ प्रिंट करने के लिए, पहले std::scientific"वैज्ञानिक अंकन में फ्लोटिंग-पॉइंट मान" लिखेंगे। दशमलव बिंदु, एक अपर्याप्त राशि के बाद 6 अंकों के डिफ़ॉल्ट को नोटिस करें, अगले बिंदु में संभाला जाता है।
std::cout << "std::scientific: " << std::scientific << exp (-100) << '\n';
std::cout << "std::scientific: " << std::scientific << exp (+100) << '\n';
// output
std::scientific: 3.720076e-44
std::scientific: 2.688117e+43
- कितनी सटीकता (कितने कुल अंक)?
doubleबाइनरी बेस 2 का उपयोग करके एक एन्कोडेड 2 की विभिन्न शक्तियों के बीच एक ही परिशुद्धता को एन्कोड करता है। यह अक्सर 53 बिट्स होता है।
[१.० ... २.०) २ ५३ भिन्न हैं double,
[२.० ... ४.०) २ ५३ भिन्न हैं double,
[४.० ... there.०) २ ५३ भिन्न हैं double,
[10.0. 10.0 ... १०)] २ / हैं * २ ५३ अलग double।
फिर भी यदि कोड Nमहत्वपूर्ण अंकों के साथ दशमलव में प्रिंट करता है , तो संयोजनों की संख्या [1.0 ... 10.0) 9/10 * 10 N है ।
जो भी N(सटीक) चुना जाता है, उसके बीच doubleऔर दशमलव पाठ में एक-से-एक मैपिंग नहीं होगी । यदि कोई निश्चित Nचुना जाता है, तो कभी-कभी यह कुछ doubleमूल्यों के लिए वास्तव में आवश्यक से थोड़ा अधिक या कम होगा । हम बहुत कम ( a)नीचे) या बहुत अधिक ( b)नीचे) त्रुटि कर सकते हैं ।
3 उम्मीदवार N:
क) Nपाठ से परिवर्तित करते समय एक का उपयोग करें double-इसलिए हम सभी के लिए एक ही पाठ में आते हैं double।
std::cout << dbl::digits10 << '\n';
// Typical output
15
b) -text Nसे कनवर्ट करते समय एक का उपयोग doubleकरें- doubleहम doubleसभी के लिए समान हैं double।
// C++11
std::cout << dbl::max_digits10 << '\n';
// Typical output
17
जब max_digits10उपलब्ध नहीं है, तो ध्यान दें कि आधार 2 और आधार 10 विशेषताओं के कारण digits10 + 2 <= max_digits10 <= digits10 + 3, हम यह digits10 + 3सुनिश्चित करने के लिए उपयोग कर सकते हैं कि पर्याप्त दशमलव अंक मुद्रित हो।
ग) एक का उपयोग करें जो Nमूल्य के साथ बदलता रहता है।
यह तब उपयोगी हो सकता है जब कोड न्यूनतम पाठ ( N == 1) या ( के मामले में ) का सही मूल्य प्रदर्शित करना चाहता है । फिर भी चूंकि यह "काम" है और ओपी के लक्ष्य की संभावना नहीं है, इसलिए इसे अलग रखा जाएगा।doubleN == 1000-ishdenorm_min
यह आमतौर पर ख) जिसका उपयोग " doubleपूर्ण परिशुद्धता के साथ एक मूल्य प्रिंट करने के लिए" किया जाता है । कुछ एप्लिकेशन बहुत अधिक जानकारी प्रदान करने में त्रुटि के कारण a) को प्राथमिकता दे सकते हैं।
साथ .scientific, .precision()सेट अंकों की संख्या दशमलव बिंदु के बाद मुद्रित करने के लिए है, तो 1 + .precision()अंक मुद्रित कर रहे हैं। कोड को max_digits10कुल अंकों की आवश्यकता होती है इसलिए .precision()इसे a के साथ कहा जाता है max_digits10 - 1।
typedef std::numeric_limits< double > dbl;
std::cout.precision(dbl::max_digits10 - 1);
std::cout << std::scientific << exp (-100) << '\n';
std::cout << std::scientific << exp (+100) << '\n';
// Typical output
3.7200759760208361e-44
2.6881171418161356e+43
//1234567890123456 17 total digits
इसी तरह का सवाल
fixed? के साथdouble h = 6.62606957e-34;,fixedमुझे0.000000000000000औरscientificआउटपुट देता है6.626069570000000e-34।