मैं 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
) या ( के मामले में ) का सही मूल्य प्रदर्शित करना चाहता है । फिर भी चूंकि यह "काम" है और ओपी के लक्ष्य की संभावना नहीं है, इसलिए इसे अलग रखा जाएगा।double
N == 1000-ish
denorm_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
।