सी ++ 17 हेक्साडेसिमल फ्लोटिंग स्थिरांक जोड़ने के लिए (floating point literal)। क्यूं कर? लाभ दिखाने वाले कुछ उदाहरणों के बारे में कैसे।सी ++ 17 में हेक्साडेसिमल फ्लोटिंग स्थिरांक क्यों?
उत्तर
फ्लोटिंग पॉइंट नंबर बेस 2 में x86/x64 प्रोसेसर में संग्रहीत हैं, आधार 10: https://en.wikipedia.org/wiki/Double-precision_floating-point_format नहीं। उन दशमलव दशमलव फ़्लोटिंग पॉइंट संख्याओं के कारण बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है, उदाहरण के लिए 0.1 0.100000000003 या 0.0999999999999997 जैसे कुछ के रूप में प्रतिनिधित्व किया जा सकता है - जो भी आधार 2 प्रतिनिधित्व दशमलव 0.1 के लिए पर्याप्त है। उस अचूकता के कारण, उदा। दशमलव में प्रिंटिंग और फिर फ़्लोटिंग-पॉइंट नंबर की पार्सिंग के परिणामस्वरूप मुद्रण से पहले बिन में स्मृति में संग्रहीत एक से थोड़ा अलग संख्या हो सकती है।
कुछ अनुप्रयोगों के लिए ऐसी त्रुटियों का उदय अस्वीकार्य है: वे प्रिंटिंग से पहले एक ही बाइनरी फ़्लोटिंग-पॉइंट नंबर में समान रूप से विश्लेषण करना चाहते हैं (उदाहरण के लिए एक एप्लिकेशन फ्लोटिंग-पॉइंट डेटा और अन्य आयात निर्यात करता है)। इसके लिए, कोई हेक्साडेसिमल प्रारूप में युगल निर्यात और आयात कर सकता है। चूंकि 16 2 की शक्ति है, बाइनरी फ़्लोटिंग-पॉइंट संख्याओं को हेक्साडेसिमल प्रारूप में बिल्कुल प्रदर्शित किया जा सकता है।
printf
और scanf
%a
फॉर्मेट स्पेसिफायर जो प्रिंट और हेक्साडेसिमल चल बिन्दु संख्या पार्स करने के लिए अनुमति देता है के साथ बढ़ाया गया है। हालांकि MSVC++ does not support %a
format specifier for scanf
अभी तक:
ए और ए विनिर्देशक (printf प्रकार फ़ील्ड वर्ण देखें) स्कैनफ़ के साथ उपलब्ध नहीं हैं।
हेक्साडेसिमल स्वरूप के साथ पूर्ण परिशुद्धता में एक double
मुद्रित करने के लिए एक बिंदु के बाद 13 हेक्साडेसिमल अंक, जो 13 * 4 = 52 बिट्स के अनुरूप की छपाई का होना चाहिए:
double x = 0.1;
printf("%.13a", x);
hexadecimal floating point with code and examples पर और विवरण देखें (ध्यान दें कि printf
में %a
के एमएसवीसी ++ 2013 के सरल विनिर्देश के लिए कम से कम 6 हेक्साडेसिमल अंक बिंदु के बाद, 13 नहीं - यह लेख के अंत में कहा गया है)।
विशेष रूप से स्थिरांक के लिए, प्रश्न में पूछे जाने पर, हेक्साडेसिमल स्थिरांक सटीक हार्ड-कोडित फ़्लोटिंग-पॉइंट इनपुट पर एप्लिकेशन का परीक्षण करने के लिए सुविधाजनक हो सकता है। जैसे आपकी बग 0.1000000000000003 के लिए पुन: उत्पन्न हो सकती है, लेकिन 0.099 99 99 99 99 99 997 के लिए नहीं, इसलिए आपको दशमलव 0.1 के लिए ब्याज के प्रतिनिधित्व को निर्दिष्ट करने के लिए हेक्साडेसिमल हार्डकोडेड मान की आवश्यकता है।
आलेख में दिखाए गए उदाहरण gcc के लिए हैं। लेख का अंतिम पैरा में मैं "% .13a" के बजाय "% एक" का उपयोग करने के लिए कुलपति के लिए ++। –
@RickRegan, माफ करना, लेख शुरू में की है कि अंत नोटिस नहीं किया था कहते हैं। मैं अपने जवाब संपादित किया है। –
दशमलव पर हेक्स फ्लोट का उपयोग करने के मुख्य 2 कारण सटीकता और गति हैं।
दशमलव स्थिरांक और फ़्लोटिंग पॉइंट नंबरों के अंतर्निहित बाइनरी प्रारूप के बीच सटीक रूप से परिवर्तित करने के लिए एल्गोरिदम surprisingly complicated हैं, और आज भी conversion errors still occasionally arise हैं।
हेक्साडेसिमल और बाइनरी के बीच कनवर्ट करना एक बहुत ही आसान प्रयास है, और सटीक होने की गारंटी है। एक उदाहरण का उपयोग केस तब होता है जब यह महत्वपूर्ण होता है कि आप एक विशिष्ट फ़्लोटिंग पॉइंट नंबर का उपयोग करते हैं, न कि एक तरफ (उदाहरण के लिए exp
जैसे विशेष कार्यों के कार्यान्वयन के लिए)। यह सादगी रूपांतरण को बहुत तेज बनाता है (इसे किसी भी मध्यवर्ती "बिग्नम" अंकगणित की आवश्यकता नहीं होती है): कुछ मामलों में मैंने हेक्स फ्लोट बनाम दशमलव के लिए पढ़ने/लिखने के संचालन के लिए 3x गति को देखा है।
मुझे समझ नहीं आता कि यह कैसे कर सकता है कोड तेजी से। उदाहरण के लिए '0xA.0f' बिल्कुल * किया जाना चाहिए *' बिट स्तर पर 10.0f' के रूप में ही है, तो कैसे स्रोत-कोड प्रतिनिधित्व संभवतः किसी भी तेजी से कार्यान्वयन बना सकता है? क्यों किसी भी क्रम रूपांतरण अगर आप 'printf' उपयोग कर रहे थे या' fscanf' – CoffeeandCode
पर मैं मतलब था? आईईईई 754 विभिन्न स्वरूपों –
इंतजार क्या हुआ अगर एक मंच base2 तैरता का उपयोग करता है और अन्य दशमलव तैरता का उपयोग करता है सब? – Swift
- 1. हेक्साडेसिमल फ्लोटिंग स्थिरांक सी
- 2. वीसी हेक्साडेसिमल फ्लोटिंग-पॉइंट निरंतर
- 3. 0xp0 प्रिंट 0.0 (हेक्साडेसिमल फ्लोटिंग प्वाइंट लिटल)
- 4. हेक्साडेसिमल फ़्लोटिंग पॉइंट का निर्दिष्ट एक्सपोनेंट क्यों होना चाहिए?
- 5. सी में unxigned हेक्साडेसिमल निरंतर?
- 6. सी ++ 17
- 7. सी ++ 17
- 8. सी # बाइनरी स्थिरांक प्रतिनिधित्व
- 9. उद्देश्य सी - क्यों स्थिरांक k
- 10. सी में स्थिरांक संशोधक
- 11. std :: सी ++ 17
- 12. सी ++ 17 ऑपरेटर ""?
- 13. सी में स्थिरांक ints ++
- 14. एसीआई चार [] से हेक्साडेसिमल चार [] में सी
- 15. हेक्साडेसिमल संख्या सी #
- 16. सी ++ 17 लैम्ब्डा कैप्चर * यह
- 17. सी ++ 17 वैराडिक टेम्पलेट फोल्डिंग
- 18. std :: में नक्शा :: डालने परिवर्तन सी ++ 17
- 19. सी - फ्लोटिंग पॉइंट राउंडिंग
- 20. हेक्साडेसिमल
- 21. सी ++ 'स्थिरांक'
- 22. क्या जीडीबी सी-स्टाइल हेक्साडेसिमल फ्लोटिंग-पॉइंट नंबरों का विश्लेषण कर सकता है?
- 23. हेक्साडेसिमल रंग मानों में अग्रणी "# एफएफ" क्यों?
- 24. प्रोग्रामिंग में स्थिरांक का उपयोग क्यों करें?
- 25. सी में हेक्साडेसिमल संख्या कैसे प्रदर्शित करें?
- 26. इस स्थिरांक स्थिरांक स्थिरांक घोषणा मान्य
- 27. सी ++ 17 गुना अभिव्यक्ति वाक्यविन्यास?
- 28. सी ++ 14/17 के लिए नेटवर्किंग लाइब्रेरी प्रस्ताव क्यों है?
- 29. शीर्षलेख में साझा सी स्थिरांक
- 30. क्या सी # में स्थिरांक हैं?
(1) सी (आईएसओ सी 99 के साथ शुरू) के साथ लंबे समय से अतिदेय संगतता के लिए (2) * अनजाने में * फ़्लोटिंग-पॉइंट स्थिरांक (विशेष रूप से आईईईई -754 बाइनरी फ्लोटिंग-पॉइंट प्रारूपों के लिए) परिभाषित करें, बिना बग अक्सर प्रभावित होते हैं दशमलव फ़्लोटिंग-पॉइंट से रूपांतरण (देखें [रिक रेगन का ब्लॉग] (http: //www.exploringbinary।com /) आधुनिक में इस तरह के कीड़े के उदाहरण के लिए, आमतौर पर इस्तेमाल किया, सॉफ्टवेयर) – njuffa
जरूरत स्पष्ट रूप से शाब्दिक फ्लोटिंग प्वाइंट स्थिरांक निर्दिष्ट करने के लिए गणित पुस्तकालय कार्यों, उदा कोड के निर्माण के लिए किया जाएगा एक उदाहरण [ 'Atanf'] (http://stackoverflow.com/questions/26692859/best-machine-optimized-polynomial-minimax-approximation-to-arctangent-on-1-1), [' erff'] (http://stackoverflow.com/questions/35148198/efficient-faithfully-rounded-implementation-of-error-function-erff), [ 'expf'] (http://stackoverflow.com/questions/29381117/which-exponentiation-algorithms- do-cpu-प्रोग्रामिंग-भाषा-उपयोग) – njuffa