2016-04-01 9 views
5

सी ++ 17 हेक्साडेसिमल फ्लोटिंग स्थिरांक जोड़ने के लिए (floating point literal)। क्यूं कर? लाभ दिखाने वाले कुछ उदाहरणों के बारे में कैसे।सी ++ 17 में हेक्साडेसिमल फ्लोटिंग स्थिरांक क्यों?

+6

(1) सी (आईएसओ सी 99 के साथ शुरू) के साथ लंबे समय से अतिदेय संगतता के लिए (2) * अनजाने में * फ़्लोटिंग-पॉइंट स्थिरांक (विशेष रूप से आईईईई -754 बाइनरी फ्लोटिंग-पॉइंट प्रारूपों के लिए) परिभाषित करें, बिना बग अक्सर प्रभावित होते हैं दशमलव फ़्लोटिंग-पॉइंट से रूपांतरण (देखें [रिक रेगन का ब्लॉग] (http: //www.exploringbinary।com /) आधुनिक में इस तरह के कीड़े के उदाहरण के लिए, आमतौर पर इस्तेमाल किया, सॉफ्टवेयर) – njuffa

+0

जरूरत स्पष्ट रूप से शाब्दिक फ्लोटिंग प्वाइंट स्थिरांक निर्दिष्ट करने के लिए गणित पुस्तकालय कार्यों, उदा कोड के निर्माण के लिए किया जाएगा एक उदाहरण [ '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

उत्तर

6

फ्लोटिंग पॉइंट नंबर बेस 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 के लिए ब्याज के प्रतिनिधित्व को निर्दिष्ट करने के लिए हेक्साडेसिमल हार्डकोडेड मान की आवश्यकता है।

+0

आलेख में दिखाए गए उदाहरण gcc के लिए हैं। लेख का अंतिम पैरा में मैं "% .13a" के बजाय "% एक" का उपयोग करने के लिए कुलपति के लिए ++। –

+0

@RickRegan, माफ करना, लेख शुरू में की है कि अंत नोटिस नहीं किया था कहते हैं। मैं अपने जवाब संपादित किया है। –

0

दशमलव पर हेक्स फ्लोट का उपयोग करने के मुख्य 2 कारण सटीकता और गति हैं।

दशमलव स्थिरांक और फ़्लोटिंग पॉइंट नंबरों के अंतर्निहित बाइनरी प्रारूप के बीच सटीक रूप से परिवर्तित करने के लिए एल्गोरिदम surprisingly complicated हैं, और आज भी conversion errors still occasionally arise हैं।

हेक्साडेसिमल और बाइनरी के बीच कनवर्ट करना एक बहुत ही आसान प्रयास है, और सटीक होने की गारंटी है। एक उदाहरण का उपयोग केस तब होता है जब यह महत्वपूर्ण होता है कि आप एक विशिष्ट फ़्लोटिंग पॉइंट नंबर का उपयोग करते हैं, न कि एक तरफ (उदाहरण के लिए exp जैसे विशेष कार्यों के कार्यान्वयन के लिए)। यह सादगी रूपांतरण को बहुत तेज बनाता है (इसे किसी भी मध्यवर्ती "बिग्नम" अंकगणित की आवश्यकता नहीं होती है): कुछ मामलों में मैंने हेक्स फ्लोट बनाम दशमलव के लिए पढ़ने/लिखने के संचालन के लिए 3x गति को देखा है।

+0

मुझे समझ नहीं आता कि यह कैसे कर सकता है कोड तेजी से। उदाहरण के लिए '0xA.0f' बिल्कुल * किया जाना चाहिए *' बिट स्तर पर 10.0f' के रूप में ही है, तो कैसे स्रोत-कोड प्रतिनिधित्व संभवतः किसी भी तेजी से कार्यान्वयन बना सकता है? क्यों किसी भी क्रम रूपांतरण अगर आप 'printf' उपयोग कर रहे थे या' fscanf' – CoffeeandCode

+0

पर मैं मतलब था? आईईईई 754 विभिन्न स्वरूपों –

+0

इंतजार क्या हुआ अगर एक मंच base2 तैरता का उपयोग करता है और अन्य दशमलव तैरता का उपयोग करता है सब? – Swift

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