ग्राहकों को फ्लोटिंग पॉइंट सटीक बताते हुए [बंद]


23

ग्राहकों को फ्लोटिंग पॉइंट राउंडिंग इश्यू समझाने का सबसे अच्छा तरीका क्या है ?

मुझे पता है

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

डेवलपर्स और वैज्ञानिकों के उद्देश्य से C ++ FAQ और विभिन्न अन्य पृष्ठों में प्रविष्टियां, लेकिन क्या एक वेब पेज, लेख या स्पष्टीकरण है, जिसका उद्देश्य सीमित गणितीय या वैज्ञानिक पृष्ठभूमि वाले "नियमित" ग्राहक हैं? (जिसके लिए उपरोक्त संदर्भ सपाट हैं)।

यदि यह एक प्रसिद्ध और अच्छी तरह से मान्यता प्राप्त संस्थान या निगम से बनाए रखा गया था या आ रहा है, तो बेहतर है, यह देखते हुए, जैसा कि आप में से कुछ ने अनुभव किया है, यह अपने आप को समझाने के लिए थोड़ा जटिल हो सकता है।


1
मैं परेशान नहीं होता ...
जॉन दस्ता

1
यह एक बहुत ही शानदार सवाल है, अगर मैं कर सकता तो +10। डेवलपर्स के लिए एक लगातार समस्या।
कोड़ी ग्रे

2
यह विस्तार की समस्या नहीं है, यह फाई का जवाब दे रहा है कि 2 दशमलव अंकों के सटीक नंबरों पर क्यों दिखता है, आप एक 5.9999999 के साथ समाप्त होते हैं और 6 नहीं होते हैं, और जब आपको "स्पष्ट" परिणाम होना चाहिए, तो आपको राउंडिंग परिशुद्धता क्यों निर्दिष्ट करनी होगी। t में दो से अधिक दशमलव अंक हैं। या कभी-कभी 2 माइनस 2 हमेशा शून्य क्यों नहीं होता है, और ऐसा करते समय बांस की तरह मूर्ख नहीं दिखता है।
एरिक ग्रेंज

9
@Eric ग्रेंज: यदि आपके ग्राहक एक बग के रूप में उन सटीक मुद्दों पर विचार करें, तो फिर, यह है एक बग और आप इसे ठीक करने के लिए (शायद नाव का उपयोग नहीं करके) एक रास्ता खोजने के लिए है। उन्हें इस बात की परवाह नहीं है कि यह सटीक मुद्दा कहां से आता है। उन्हें इस बात की परवाह नहीं है कि आपका सॉफ्टवेयर कैसे काम करता है। वे चाहते हैं कि यह काम करे।
डेविड

3
@ एरिक: फ्लोटिंग-पॉइंट का उपयोग कार्यान्वयन विवरण है। मैं अपना प्रश्न दोहराता हूं, जो प्रश्न में समझाया गया कुछ नहीं मांगता है, और जो मैंने स्पष्ट रूप से स्पष्ट नहीं किया है (माफी): क्या संदर्भ है, और आप एक ग्राहक के साथ फ्लोटिंग पॉइंट के उपयोग पर चर्चा क्यों कर रहे हैं?
टॉम एंडरसन

जवाबों:


8

मुझे यह समझाने का एक सरल तरीका है कि इसे प्रदर्शित करेंxकिसी संख्या से कैसे विभाजित करें पर चर्चा करें , फिर उसी संख्या से गुणा करके आपको xफिर से वापस लौटना चाहिए - ग्राहक को इस बात से सहमत होने के लिए कहें कि यह हमेशा होना चाहिए। फिर (100 / 3) * 3एक कैलकुलेटर पर पुराना करें ; दिखाते हैं कि मूल्य, जैसा कि आप उम्मीद करेंगे, 100 पर वापस नहीं आएगा। जब ज्यादातर लोग स्पष्ट रूप से सरल गणित "ब्रेकिंग" देखते हैं, तो फ़्लोटिंग पॉइंट नंबरों के खतरे को 'प्राप्त' करते हैं जहां सटीकता महत्वपूर्ण है (हालांकि एक सहज ज्ञान युक्त है) जिस तरह से, जिस स्तर पर आप जाने के लिए इंगित करते हैं, उसके बजाय)।

दुर्भाग्य से सबसे अधिक अर्ध-सभ्य कैलकुलेटर (निश्चित रूप से सभी वैज्ञानिक जिन्हें मैंने देखा है, और कुछ बुनियादी लोगों की तुलना में अधिक) आजकल इसे संभालने में सक्षम हैं - मुझे लगता है कि वे अतिरिक्त अंकों को संग्रहीत कर रहे हैं जो प्रदर्शित और गोल हो सकते हैं - इसलिए करते हैं जाँच करें कि आपके ग्राहक के सामने आपका कैलकुलेटर कितना चालाक है।


1
हां, लगभग सभी कैलकुलेटर कम से कम 2 अतिरिक्त अंकों का भंडारण कर रहे हैं, इसलिए आपको मिश्रण में कुछ गुणाओं को जोड़ना होगा, जो स्पष्टीकरण को अस्पष्ट करता है, और IME उन्हें लगता है कि आप उन्हें बेवकूफ बनाने की कोशिश कर रहे हैं। स्क्वायर रूट को कम संचालन की आवश्यकता होती है, लेकिन स्क्वायर रूट पहले से ही नियमित ग्राहकों के रोजमर्रा के दायरे से बाहर है।
एरिक ग्रेंज

2
@ देखें मैंने कुछ कैलकुलेटर पर कोशिश की, किसी ने भी (100/3) * 3, यहां तक ​​कि (100/3) * 3-100 के साथ मुद्दों को प्रदर्शित नहीं किया .... मुद्दों को प्रदर्शित नहीं किया गया। एक्सेल को यह सही भी लगता है।
एरिक ग्रेंज

9
एक उदाहरण के रूप में पैसे लें, जिसमें एक सटीक सीमित परिशुद्धता है। समझाएं कि आप एक डॉलर को विभाजित करते हैं, फिर प्रत्येक व्यक्ति को 33 सेंट मिलते हैं और एक पैसा गोलाई में खो जाता है। कोई भी इससे संबंधित हो सकता है।
इंका

4
कैलकुलेटर के साथ परेशान मत करो। तीन महत्वपूर्ण अंकों को रखते हुए, कागज पर 1 को 3 से विभाजित करें।
डेविड थॉर्नले

5
@omegacentauri अगर आपको लगता है कि स्पष्टीकरण से मदद मिलती है, तो मुझे लगता है कि आप अक्सर ग्राहकों से बात नहीं करते हैं।
झॉकिंग

5

मुझे नहीं लगता कि शॉर्टकट हैं। आपको या तो:

  • समझें कि फ्लोटिंग पॉइंट क्या है और यह कैसे व्यवहार करता है।

या, यदि यह बहुत आवश्यक है, तो आपको बस:

  • स्वीकार करें कि कंप्यूटर आपको सटीक संख्यात्मक परिणाम नहीं देगा।

शायद तर्कहीन संख्याओं के साथ एक उदाहरण मदद करता है (भले ही फ़्लोटिंग पॉइंट मुद्दे तर्कसंगत संख्याओं पर भी लागू होते हैं) sqrt(2) ~ 1.414:। तब 1.414^2 = 1.999396। कोई फर्क नहीं पड़ता कि आप कितने अंक लेते हैं, आप कभी भी मूल में वापस नहीं आएंगे 2। ठीक है, 4 महत्वपूर्ण अंक सही स्वीकार्य हो सकते हैं, लेकिन फिर विचार करें कि जब इस तरह की "गोल त्रुटियां" जमा होती हैं तो क्या होता है। यहीं से असली खतरा है।


2
मैं व्यक्तिगत रूप से जानता हूं और समझता हूं, लेकिन कुछ लोगों के लिए "फ्लोटिंग पॉइंट" पहले से ही एक विदेशी शब्द है, इसलिए आपको यह समझाने के लिए गणितीय या वैज्ञानिक स्पष्टीकरण की आवश्यकता है कि वे अपने सिर में सही गणना क्या कर सकते हैं, उनके महंगे कंप्यूटर और सॉफ़्टवेयर को सही होने में परेशानी है ;) इसके अलावा वर्गमूल नियमित ग्राहकों के रोजमर्रा के दायरे से बाहर है।
एरिक ग्रेंज

5

पहले, यह निर्धारित करें कि वे किस बारे में शिकायत कर रहे हैं। दशमलव के सही स्थानों और सही गोलाई नियमों के साथ वित्तीय लेनदेन ठीक से किया जाना है। इसका मतलब आमतौर पर मुद्रा इकाइयों का अभिन्न नंबर बनाए रखना और यह सुनिश्चित करना कि अंकगणित सही किया जाता है।

वैकल्पिक रूप से, वे ओवरएक्टैक्ट डिस्प्ले के बारे में शिकायत कर सकते हैं, और महत्वपूर्ण अंकों के आउटपुट को कम करने के लिए यह आवश्यक हो सकता है।

सामान्य रूप से संख्याओं के लिए, आप हमेशा तीन अंकों वाले दशमलव x के साथ आने का प्रयास कर सकते हैं जैसे कि x * 3 10. है। यह मूल सिद्धांतों को दर्शाता है।

शेष दो समस्याएं हैं। एक यह है कि कुछ संख्याओं को दशमलव में बिल्कुल व्यक्त किया जा सकता है लेकिन बाइनरी (3.15, कहते हैं) नहीं। यह गैर-तकनीकी लोगों को समझाने के लिए कठिन होने जा रहा है, और आपका सबसे अच्छा शर्त यह है कि इसे दिखाने के लिए पर्याप्त महत्वपूर्ण अंक प्रदान न करके इससे बचने की कोशिश करें। दूसरा वह ग्राहक है जो थोड़ा बहुत जानता है, यह जानने के लिए पर्याप्त है कि कंप्यूटर अंकगणित हमेशा सटीक नहीं होता है और यह महसूस करने के लिए पर्याप्त नहीं है कि दशमलव अंकगणित हमेशा सटीक नहीं होता है। मैंने उनमें से कुछ के साथ तर्क दिया है, और रिपोर्ट करने के लिए कुछ भी उपयोगी नहीं है।


3

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

अब एक डॉलर के आधा, चौथाई, आठवें के संयोजन के रूप में 10 सेंट को स्टोर करने का प्रयास करें। यह सिर्फ काम नहीं करता है:

.00011001100110011 । । ( अनंत बार दोहराता है )

यह एक मानक शाही माप टेप लेने के समान है और एक इंच के दसवें को मापने की कोशिश कर रहा है। आप इसे सही ढंग से नहीं कर सकते। X / Y के रूप में 1/10 का कोई प्रतिनिधित्व नहीं है जहां X और Y पूरी संख्या हैं और Y 2 की शक्ति है।

यही कारण है कि हमारे पास दशमलव डेटा प्रकार हैं जो प्रत्येक दशमलव अंक को संग्रहीत करने के लिए 4 बिट्स का उपयोग करते हैं, इसलिए हम आधार 10 प्रतिनिधित्व के लिए वापस आ गए हैं। व्यापार-बंद अंतरिक्ष और प्रदर्शन में है (लगभग 100% प्रदर्शन हिट है, जो मैंने पढ़ा है)।


1

उन्हें बताएं कि जैसे उनका बैंक खाता 4.4423425908459032890413 हो सकता है ... डॉलर (यह या तो $ 4.44 या $ 4.45, बीच में कुछ भी नहीं है), कंप्यूटर आसानी से मनमानी परिशुद्धता के साथ एक नंबर स्टोर नहीं कर सकता है। भंडारण के दोषों से अभिकलन की खामियां पैदा होती हैं।

(यह थोड़ा धोखा है, लेकिन उन्हें इस बात का अंदाजा लगाना चाहिए कि समस्या क्या है।)


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

1
दो दशमलव अंक। हां, मैं सहमत हूं, एक जिज्ञासु ग्राहक इसमें छेद करेगा। लेकिन फिर आप उन्हें बाइनरी प्रतिनिधित्व की चर्चा के साथ हिट कर सकते हैं - उन्होंने इसके लिए पूछा ;-)
quant_dev

खैर, पहले से ही फ्लोटिंग पॉइंट को समझाने की कोशिश कर रहे हैं कि वे IME तुरंत यह सोचना शुरू कर रहे हैं कि आप उन्हें बाँधने की कोशिश कर रहे हैं, जो कि कुछ ऐसा है जिसे सरल, समझने योग्य शब्दों में, या एक अच्छी तरह से जानने वाली संस्था या निगम से आ रहा है। :)
एरिक ग्रेंज

1
@ एरिक मैथ कठिन है, चलो खेलते हैं बेसबॉल: पी
क्वांट_देव

1
यह पूछें कि क्या निकटतम 1/10 ", या निकटतम मिलीमीटर को मापने के लिए यह अधिक सटीक है। उत्तरार्द्ध अधिक सटीक है, लेकिन जो वस्तुएं 0.1 के सटीक एकाधिक हैं" 1 मिमी के सटीक कई नहीं होंगे जब तक कि वे एक भी न हों 5 "(ठीक 127 मिमी) के सटीक कई। दो 2.54 मिमी वस्तुओं के आकार को जोड़ना जो निकटतम 0.1 में मापा जाता है" 0.2 के संयुक्त आकार का उत्पादन करेगा "; निकटतम मिलीमीटर के लिए गोल आकार को एक साथ जोड़ने पर भी 6 मिमी का उत्पादन होगा; वास्तविक आकार
5.08 मिमी

1

2/3

उन्हें तीन से विभाजित दो का सटीक उत्तर लिखने के लिए कहें।
चूंकि उत्तर 'हमेशा के लिए चलता है' इसलिए आप इसे इंगित कर सकते हैं।

1/3 का उपयोग करना भी काम करेगा, लेकिन 2/3 शायद थोड़ा बेहतर उदाहरण है क्योंकि गोलाई आपको (जैसे) .6666667 देता है जबकि .3333333 ऐसा लगता है कि इसे अभी छोटा किया जा सकता है।


0

गणना करते समय कंप्यूटर आमतौर पर संख्याओं के लिए सन्निकटन का उपयोग करते हैं (जैसे 1000000.7 का उपयोग करने के बजाय वे 1000000 का उपयोग करते हैं) क्योंकि सन्निकटन का उपयोग करना बहुत तेज है। इसके साथ समस्या यह है कि जब आप गणना के साथ गणना करते हैं तो आपको सन्निकटन वापस मिल जाता है। आमतौर पर यह बहुत अच्छा काम करता है, लेकिन कभी-कभी यह अप्रत्याशित परिणाम देता है।


मैं वास्तव में समझ नहीं पाया कि आप यहाँ क्या कह रहे हैं। "क्योंकि सन्निकटन का उपयोग करना बहुत तेज है"? कभी-कभी पूर्णांक अंकगणित कम से कम उपवास के रूप में होता है, और यह सटीक है। कभी-कभी कोई विकल्प नहीं होता है (2 के वर्गमूल को प्रिंट करने के रूप में)।
डेविड थॉर्नले

वैसे आप मार्केटिंग करने वाले व्यक्ति को यह समझाने की कोशिश करते हैं कि कंप्यूटर वास्तव में तर्कहीन संख्याओं का प्रतिनिधित्व क्यों नहीं कर सकते हैं, या मूल रूप से चीजों की भव्य योजना में कोई भी संख्या (ओह) और फिर आप उसे \ pi की तर्कहीनता पर एक त्वरित व्याख्यान देना चाहते हैं: कुछ पर फूरियर श्रृंखला प्यारा हो सकता है)। लगभग एक ऐसा शब्द है जिसे लोग समझ सकते हैं। आप इसे किसी ऐसे व्यक्ति के दृष्टिकोण से देख रहे हैं जो जानता है कि सभी संख्याएँ समान नहीं हैं।

0

कुछ गणना कुछ कानूनी नियम के अनुसार की जाती है। उदाहरण के लिए, यदि आप गणना करना चाहते हैं कि जर्मनी में € 79.245,18 की कर योग्य वार्षिक आय पर कितना आयकर चुकाना पड़ता है, तो केवल एक सही उत्तर है। आप इसे सही पाते हैं या आप इसे गलत पाते हैं। यदि आपको यह सही लगता है, तो आपको यह समझाने की आवश्यकता नहीं है कि फ्लोटिंग पॉइंट अंकगणितीय कैसे काम करता है। यदि आपको यह गलत लगता है, तो आपको यह समझाने की आवश्यकता नहीं है कि फ्लोटिंग अंक अंकगणितीय कैसे काम करता है, आपको अपना टूटा हुआ कोड ठीक करना होगा।

कभी-कभी आप ऐसे परिणाम प्रदर्शित करते हैं जो सही नहीं लगते हैं। उदाहरण के लिए, यदि आप US $ 13,297.46 को दो पाउंड अंकों के साथ यूके पाउंड में परिवर्तित करते हैं, और फिर यूके पाउंड की राशि को यूएस $ में परिवर्तित करते हैं, तो आपको यूएस $ 13,297.46 नहीं बल्कि यूएस $ 13,297.445 या यूएस $ 13,297.47 मिल सकता है। इसका फ्लोटिंग-पॉइंट अंकगणित से कोई लेना-देना नहीं है। यह एक अपरिहार्य समस्या है और आप बेहतर समझ सकते हैं कि यह अपरिहार्य क्यों है। (आपको यह भी पता होना चाहिए कि यूके पाउंड से यूएस $ और बैक में परिवर्तित होने पर समस्या क्यों नहीं होती है)।

अन्य संभावित परिणाम हैं जो सही नहीं लगते हैं। यदि आप संख्याओं को प्रतिशत में बदलते हैं तो प्रतिशत 100% तक जोड़ना चाहिए, लेकिन वे नहीं हो सकते हैं। यदि आप दो दशमलव के साथ चार प्रतिशत प्रदर्शित करते हैं, तो चार प्रदर्शित प्रतिशत 99.99% या 100.01% तक बढ़ सकते हैं। फ्लोटिंग-पॉइंट अंकगणित से कोई लेना देना नहीं है। फिर भी आपको यह समझाने में सक्षम होना चाहिए कि क्यों।

अगला, ऐसी परिस्थितियां हैं जहां फ्लोटिंग-पॉइंट अंकगणित के लापरवाह उपयोग से अनुचित परिणाम प्राप्त होते हैं। उदाहरण के लिए, a + b + c आमतौर पर b + c + a जैसा नहीं होता है। यदि वह समस्या का कारण बनता है, तो समझाने के लिए कुछ नहीं है, यह कुछ ऐसा है जिसे आप ठीक करते हैं।

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