'फ्लोट' बनाम 'डबल' सटीक


155

कोड

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

आपको आउटपुट देगा

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

जहां तीसरी पंक्ति का उत्पादन 741012573242कचरा है और चौथी पंक्ति 116में कचरा है। क्या डबल्स में हमेशा 16 महत्वपूर्ण आंकड़े होते हैं जबकि फ्लोट्स में हमेशा 7 महत्वपूर्ण आंकड़े होते हैं? युगल के पास 14 महत्वपूर्ण आंकड़े क्यों नहीं हैं?

जवाबों:


146

C में फ्लोटिंग पॉइंट नंबर IEEE 754 एन्कोडिंग का उपयोग करते हैं ।

इस प्रकार की एन्कोडिंग एक संकेत, एक महत्व और एक घातांक का उपयोग करती है।

इस एन्कोडिंग की वजह से, कई नंबरों में छोटे बदलाव होंगे ताकि उन्हें संग्रहीत किया जा सके।

इसके अलावा, महत्वपूर्ण अंकों की संख्या थोड़ी बदल सकती है क्योंकि यह एक द्विआधारी प्रतिनिधित्व है, दशमलव नहीं।

सिंगल प्रिसिजन (फ्लोट) आपको 23 बिट्स ऑफ एंपेंडेंट, 8 बिट्स ऑफ एक्सपोनेंट और 1 साइन बिट देता है।

डबल प्रिसिजन (डबल) आपको 52 बिट्स ऑफ एंपेंड, 11 बिट्स ऑफ एक्सपोनेंट और 1 साइन बिट देता है।


4
C99 करता है, पहले यह संकलक तक था।
एलन ज्यूलीन

21
-1 यह कथन स्पष्ट रूप से गलत है: "इस एन्कोडिंग के कारण, आप कभी भी यह गारंटी नहीं दे सकते हैं कि आपके मूल्य में कोई बदलाव नहीं होगा।"
R .. गिटहब स्टॉप हेल्पिंग ICE

16
@ एलन: C99 को IEEE फ़्लोटिंग पॉइंट की आवश्यकता नहीं है; यह सिर्फ इसकी सिफारिश करता है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

4
@ एलन: आर .. सही है; अनुलग्नक एफ (जो IEEE-754 बाइंडिंग निर्दिष्ट करता है) मानक है, लेकिन केवल तभी लागू होता है जब एक कार्यान्वयन परिभाषित करता है __STDC_IEC_559__। एक कार्यान्वयन जो उस मैक्रो को परिभाषित नहीं करता है जो IEEE-754 के अनुरूप नहीं है।
स्टीफन कैनन

12
@Alan: आईईईई के तहत 754, यह आसानी से गारंटी है मूल्यों में कोई परिवर्तन नहीं है कि वहाँ 0.5, 0.046875या 0.376739501953125उनके दशमलव अभ्यावेदन बनाम। (ये सब घातांक में हरनेक फिटिंग के मैन्टिसा और बेस -2 लॉगरिथम में अंश फिटिंग के साथ सभी डायडिक तर्क हैं।)
R .. GitHub STOP HELPING ICE

42

क्या डबल्स में हमेशा 16 महत्वपूर्ण आंकड़े होते हैं जबकि फ्लोट्स में हमेशा 7 महत्वपूर्ण आंकड़े होते हैं?

सं। डबल्स में हमेशा 53 महत्वपूर्ण बिट्स होते हैं और फ़्लोट्स में हमेशा 24 महत्वपूर्ण बिट्स होते हैं (केवल डॉर्मोल्स, इन्फिनिटी और NaN मानों को छोड़कर, लेकिन वे एक अलग प्रश्न के लिए विषय होते हैं)। ये द्विआधारी प्रारूप हैं, और आप केवल द्विआधारी अंकों (बिट्स) के संदर्भ में उनके प्रतिनिधित्व की शुद्धता के बारे में स्पष्ट रूप से बोल सकते हैं।

यह इस सवाल के अनुरूप है कि बाइनरी पूर्णांक में कितने अंकों को संग्रहीत किया जा सकता है: एक अहस्ताक्षरित 32 बिट पूर्णांक 32 बिट्स के साथ पूर्णांक स्टोर कर सकता है, जो दशमलव अंकों की किसी भी संख्या के लिए सटीक रूप से मैप नहीं करता है: सभी पूर्णांक 9 दशमलव अंकों को संग्रहीत किया जा सकता है, लेकिन बहुत से 10-अंकीय संख्याओं को भी संग्रहीत किया जा सकता है।

युगल के पास 14 महत्वपूर्ण आंकड़े क्यों नहीं हैं?

एक डबल का एन्कोडिंग 64 बिट्स (साइन के लिए 1 बिट, एक्सपोर्टर के लिए 11 बिट्स, 52 स्पष्ट महत्वपूर्ण बिट्स और एक निहित बिट) का उपयोग करता है, जो एक फ्लोट (32 बिट्स) का प्रतिनिधित्व करने के लिए उपयोग किए जाने वाले बिट्स की संख्या से दोगुना है।


15

फ्लोट: महत्व के 23 बिट्स, एक्सपोनेंट के 8 बिट्स, और 1 साइन बिट।

डबल: महत्व के 52 बिट्स, एक्सपोर्टर के 11 बिट्स, और 1 साइन बिट।


11

यह आम तौर पर आधार 2 में घातांक और महत्व दोनों के महत्वपूर्ण आंकड़ों पर आधारित है, आधार 10 नहीं। C99 मानक में मैं जो बता सकता हूं, उससे, हालांकि, फ़्लोट्स और डबल्स के लिए कोई निर्दिष्ट परिशुद्धता नहीं है (तथ्य यह है कि 1 और 1 + 1E-5/ के अलावा) 1 + 1E-7भेद कर रहे हैं [ floatऔर doublerepsectively])। हालांकि, कार्यान्वयनकर्ता के लिए महत्वपूर्ण आंकड़ों की संख्या को छोड़ दिया जाता है (साथ ही वे किस आधार का आंतरिक रूप से उपयोग करते हैं, इसलिए दूसरे शब्दों में, एक कार्यान्वयन इसे आधार 3 में परिशुद्धता के 18 अंकों के आधार पर बनाने का निर्णय ले सकता है)। [1]

आप इन मूल्यों, स्थिरांक जानना चाहते हैं तो FLT_RADIXऔर FLT_MANT_DIG(और DBL_MANT_DIG/ LDBL_MANT_DIG) float.h में परिभाषित कर रहे हैं।

इसका कारण यह कहा जाता doubleहै क्योंकि इसे संग्रहीत करने के लिए उपयोग किए जाने वाले बाइट्स की संख्या एक फ्लोट की संख्या से दोगुनी है (लेकिन इसमें घातांक और महत्व दोनों शामिल हैं)। IEEE 754 मानक (अधिकांश संकलक द्वारा उपयोग किया जाता है) प्रतिपादक की तुलना में महत्व के लिए अपेक्षाकृत अधिक बिट्स आवंटित करते हैं (23 से 9 floatबनाम बनाम 52 से 12 के लिए double), यही वजह है कि परिशुद्धता दोगुनी से अधिक है।

1: धारा 5.2.4.2.2 ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf )


लेखन त्रुटि है? C89 ज्यादा से ज्यादा का एक एप्सिलॉन की आवश्यकता है 1E-9के लिए double, नहीं 1E-7
रफालविंड

10

एक फ्लोट में परिशुद्धता के 23 बिट्स होते हैं, और एक डबल में 52 होते हैं।


विवरण: बाइनरी 64 में 53 बिट महत्वपूर्ण (52 स्पष्ट रूप से संग्रहीत) बाइनरी 32 में 24 बिट (23 स्पष्ट रूप से संग्रहीत) है।
chux -

4

यह बिल्कुल नहीं है डबल क्योंकि कैसे की शुद्धता आईईईई 754 काम करता है, और क्योंकि द्विआधारी वास्तव में दशमलव के लिए अच्छी तरह से अनुवाद नहीं करता है। यदि आप रुचि रखते हैं तो मानक देखें।


4

फ्लोट का मतलब फ्लोटिंग पॉइंट नंबर होता है। C में, फ्लोट डेटा टाइप का उपयोग उन मामलों में किया जाता है, जिनमें अंकों की कुल संख्या की शुद्धता 7. पूर्ण होती है जैसे: - दशमलव सं। 12.3546987 को फ्लोट में संग्रहीत नहीं किया जा सकता है क्योंकि इसमें कुल 9 अंक हैं। आउटपुट को 12.354699 के रूप में दिखाया जाएगा अर्थात पहले 7 अंक इनपुट में दर्ज किए गए अनुसार दिखाए जाएंगे और 8 वां अंक गोल होगा। फ्लोट प्रकार मानों का प्रतिनिधित्व कर सकता है लगभग 1.5 x 10 ^ (- 45) से लेकर 3.4 x 10 ^ (38) तक। स्मृति आवंटन के संदर्भ में, फ्लोट एक एकल-सटीक, 32-बिट फ़्लोटिंग पॉइंट डेटा प्रकार है।

फ्लोट के विपरीत, डबल में 15 से 16 अंकों की सटीकता है। डबल की सीमा 5.0 × 10 ^ (- 345) से 1.7 × 10 ^ (308) है। बाइट आवंटन के संदर्भ में, डबल 64-बिट फ्लोटिंग पॉइंट डेटा है। प्रकार।

इसके उपयोग में समस्या उत्पन्न होती है। फ़्लोट या डबल प्रिंटफ़ को प्रभावित नहीं करता है, लेकिन स्कैनफ़ के मामले में कुल संख्या के आधार पर उपयुक्त डेटा प्रकार का उपयोग किया जाता है। फ्लोटिंग नंबर में अंकों की। यह इनपुट से पढ़ा जाना है।

इसलिए डेटा की उच्च सटीकता के लिए फ्लोट पर डबल पसंद किया जाता है।

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.