2012-08-28 23 views
5

द्वारा सही ढंग से प्रदर्शित नहीं किया जा सकता है डबल डेटा प्रकार कुछ आधार 10 मानों का सही ढंग से प्रतिनिधित्व नहीं कर सकता है। यह इस वजह से है कि फ़्लोटिंग पॉइंट नंबर वास्तविक संख्याओं का प्रतिनिधित्व कैसे करते हैं। इसका अर्थ यह है कि मौद्रिक मूल्यों का प्रतिनिधित्व करते समय, त्रुटियों को रोकने के लिए किसी को दशमलव मान प्रकार का उपयोग करना चाहिए। (इस प्रस्ताव में त्रुटियों को सही करने के लिए स्वतंत्र महसूस करें)कौन से मानों को डबल

जो मैं जानना चाहता हूं वह मानक है जो मानक डेटा में 64 बिट आर्किटेक्चर के तहत डबल डेटा-प्रकार के तहत ऐसी समस्या प्रस्तुत करता है। सी # अगर वह एक फर्क पड़ता है) ?

मुझे उम्मीद है कि इस तरह के मूल्यों को खोजने के लिए उत्तर एक सूत्र या नियम होगा, लेकिन मुझे कुछ उदाहरण मान भी पसंद आएंगे।

+0

मौद्रिक मूल्यों का प्रतिनिधित्व करते समय दशमलव का उपयोग करें - यह सच है..और 64 बिट या 32 बिट आर्क पर इसका पालन किया जाना चाहिए। – JonH

+0

या बिगइंटर के रूप में सेंट (या उप-संत) :) – Joey

+0

.NET, 64 आर्किटेक्चर इत्यादि को निर्दिष्ट करने के लिए, यदि मेरे प्रश्न का उत्तर देने के लिए किसी भी कार्यान्वयन विवरण को ध्यान में रखा जाना था। – Gilles

उत्तर

7

कोई भी संख्या जो 2 की सकारात्मक और नकारात्मक शक्तियों के योग के रूप में नहीं लिखी जा सकती है एक बाइनरी फ्लोटिंग-पॉइंट नंबर के रूप में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है।

सामान्य IEEE formats for 32- और फ्लोटिंग-पॉइंट संख्याओं के 64-बिट प्रतिनिधित्वों में और बाधाएं लागू होती हैं; वे दोनों महत्व और एक्सपोनेंट में बाइनरी अंकों की संख्या को सीमित करते हैं। इसलिए अधिकतम और न्यूनतम प्रतिनिधित्व योग्य संख्याएं हैं (लगभग +/- 10^308 (आधार -10) यदि स्मृति सेवा करता है) और प्रतिनिधित्व की जा सकने वाली संख्या की सटीकता तक सीमित है। परिशुद्धता पर यह सीमा का मतलब है कि, 64-बिट संख्याओं के लिए, 2 की सबसे बड़ी शक्ति के एक्सपोनेंट के बीच अंतर और संख्या में सबसे छोटी शक्ति 52 तक सीमित है, इसलिए यदि आपकी संख्या में 2^52 में कोई शब्द शामिल है 2^-1 में एक शब्द भी शामिल नहीं है।

संख्याओं के सरल उदाहरण जिन्हें बाइनरी फ़्लोटिंग-पॉइंट संख्याओं में बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है उनमें 1/3, 2/3, 1/5 शामिल हैं।

चूंकि फ़्लोटिंग-पॉइंट नंबर (किसी भी प्रतिनिधित्व में) के सेट सीमित हैं, और वास्तविक संख्याओं का सेट अनंत है, एक वास्तविक संख्या खोजने के लिए एक एल्गोरिदम जो फ़्लोटिंग-पॉइंट नंबर के रूप में बिल्कुल प्रतिनिधित्व नहीं करता है चुनना है यादृच्छिक पर एक असली संख्या। संभावना है कि वास्तविक संख्या एक फ़्लोटिंग-पॉइंट संख्या के रूप में बिल्कुल प्रतिनिधित्व योग्य है 0 है।

+1

जबकि '10^5000' को 'डबल' द्वारा प्रदर्शित नहीं किया जा सकता है, इसे वास्तव में बाइनरी फ़्लोटिंग-पॉइंट नंबर के रूप में प्रदर्शित किया जा सकता है। – CodesInChaos

1

यह प्रश्न वास्तव में किसी भी प्रोग्रामिंग भाषा या प्लेटफ़ॉर्म से परे चला जाता है। गलतता वास्तव में बाइनरी डेटा में अंतर्निहित है।

मान लें कि एक डबल के साथ, दशमलव बिंदु के बाईं ओर प्रत्येक संख्या एन (0-आधारित इंडेक्स I पर) मान N * 2^I का प्रतिनिधित्व करता है और दशमलव बिंदु के दाईं ओर प्रत्येक अंक मान N को दर्शाता है * 2^(- I)।

उदाहरण के तौर पर, 5.625 (आधार 10) 101.101 (आधार 2) होगा।

इस गणना को देखते हुए, और दशमलव मान जिसे 2^(- I) के योग के रूप में गणना नहीं की जा सकती है, मेरे पास अलग-अलग मानों के लिए एक डबल मान होगा।

+1

यह सिर्फ सवाल पूछता है। मुझे कैसे पता चलेगा कि एक विशेष आधार 10 दशमलव मान को सीमित * के लिए एन * 2^-i के रूप में प्रदर्शित किया जा सकता है? – Servy

+0

@ सर्वी: http://cs.furman.edu/digitaldomain/more/ch6/dec_frac_to_bin.htm और कई अन्य संदर्भ आपके प्रश्न का उत्तर देते हैं। –

+1

@HighPerformanceMark तो आपको इसे अपने उत्तर में शामिल करना चाहिए। इसके बिना, आप वास्तव में किसी समस्या को हल करने में उसकी सहायता नहीं कर रहे हैं, आप बस उसे हल करने के लिए एक नई समस्या दे रहे हैं। – Servy

1

आपको आमतौर पर इस संभावना के लिए तैयार होने की आवश्यकता है कि double में आपके द्वारा संग्रहीत कोई भी मूल्य कुछ छोटी त्रुटि है। जब तक आप निरंतर मूल्य संग्रहित नहीं कर रहे हैं, संभावना है कि यह कम से कम कुछ त्रुटि के साथ कुछ हो सकता है। यदि यह जरूरी है कि कभी भी कोई त्रुटि न हो, और मान स्थिर नहीं हैं, तो शायद आपको फ़्लोटिंग पॉइंट प्रकार का उपयोग नहीं करना चाहिए।

आपको शायद कई मामलों में क्या पूछना चाहिए, "मैं मामूली फ्लोटिंग पॉइंट त्रुटियों से कैसे निपटूं?" आप जानना चाहेंगे कि किस तरह के संचालन के परिणामस्वरूप बहुत सारी त्रुटियां हो सकती हैं, और किस प्रकार नहीं हैं। आप यह सुनिश्चित करना चाहते हैं कि "समानता" के लिए दो मानों की तुलना करना वास्तव में सुनिश्चित करता है कि वे बिल्कुल बराबर के बजाय "पर्याप्त बंद" हैं।

+0

यह क्यों कम किया गया था - इसके बारे में स्वाभाविक रूप से कुछ भी गलत नहीं है? – JonH

+0

@ जोनएच मैं थोड़ा उत्सुक हूं। मुझे लगता है कि तकनीकी रूप से मैंने सवाल का जवाब नहीं दिया, मैंने पूछा कि वास्तविक प्रश्न पूछे बिना मूल समस्या को हल करने का प्रयास किया। – Servy

+0

लेकिन आपका उत्तर प्रश्न का उत्तर देने में मदद करता है, मैं इसे उखाड़ फेंक दूंगा लेकिन मुझे डर है कि यह कुछ प्रकार की प्रतिशोध है, आपके बयान के बारे में कुछ भी गलत नहीं है। – JonH

1

एक नाव निम्न सूत्र में s, e और m के रूप में प्रस्तुत किया जाता है

s * m * 2^e 

इसका मतलब है कि किसी भी संख्या है कि और दिए गए अभिव्यक्ति का उपयोग कर (s, e और m के संबंधित डोमेन में नहीं दर्शाया जा सकता) बिल्कुल प्रतिनिधित्व नहीं किया जा सकता है।

असल में, आप 0 और 2^53 - 1 के बीच सभी संख्याओं का प्रतिनिधित्व कर सकते हैं जो दो (संभवतः एक नकारात्मक शक्ति) की एक निश्चित शक्ति से गुणा हो जाते हैं।

उदाहरण के तौर पर, 0 और 2^53 - 1 के बीच सभी संख्याओं को 2^0 = 1 के साथ गुणा किया जा सकता है। और आप उन सभी संख्याओं को 2 (.5 अंश के साथ) द्वारा विभाजित करके भी प्रदर्शित कर सकते हैं। और इसी तरह।

यह उत्तर विषय को पूरी तरह से कवर नहीं करता है, लेकिन मुझे आशा है कि इससे मदद मिलती है।