फ़्लोटिंग पॉइंट राउंडिंग त्रुटियों का क्या कारण है?


62

मुझे पता है कि फ्लोटिंग पॉइंट अंकगणित में सटीक समस्याएं हैं। मैं आमतौर पर संख्या के एक निश्चित दशमलव प्रतिनिधित्व पर स्विच करके या केवल त्रुटि की उपेक्षा करके उन्हें दूर करता हूं।

हालांकि, मुझे नहीं पता कि इस अशुद्धि के कारण क्या हैं। फ्लोट संख्या के साथ इतने सारे गोल मुद्दे क्यों हैं?


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

12
: मेरी सबसे आम भ्रम स्पष्ट करने के लिए प्रयास floating-point-gui.de
माइकल Borgwardt

मुझे लगता है कि @DanielPryden का क्या मतलब है "[एक निश्चित-बिंदु] प्रतिनिधित्व पर स्विच करना गोलाई को अधिक सहज तरीके से व्यवहार कर सकता है ..." । राउंडिंग समस्याओं का कारण क्या है, क्या यह निश्चित है या फ्लोटिंग-पॉइंट नंबर या तो परिमित शब्द चौड़ाई है। यह सिर्फ इतना है कि, फ्लोटिंग-पॉइंट के साथ, गोलाई की त्रुटि का परिमाण सामान्य रूप से गोल की गई संख्या के परिमाण के लगभग आनुपातिक रहता है। (सिवाय इसके कि जब आप वास्तव में छोटे हों और "भाजित" संख्याएँ प्राप्त करें।)
रोबर्ट ब्रिस्टो-जॉनसन

@robert: यह बिल्कुल वैसा नहीं है जैसा मैं जिक्र कर रहा था। फ़्लोटिंग पॉइंट के साथ अधिकांश लोगों की "त्रुटि" का फ़्लोटिंग पॉइंट प्रति सेगिंग के साथ कुछ भी नहीं है, यह आधार है। IEEE-754 फ़्लोट्स और डबल्स बेस 2 में एक घातांक का उपयोग करते हैं, जिसका अर्थ है कि भिन्नात्मक संख्याएं 10 (1/1) की नकारात्मक शक्तियों के बजाय दो (1/2, 1/16, 1/1024, आदि) की नकारात्मक शक्तियों के लिए गोल होती हैं। 10, 1/1000, इत्यादि) यह 0.1% से 0.1000001 और इसी तरह के मुद्दों जैसे अनपेक्षित परिणामों की ओर जाता है।
डैनियल प्राइडेन

आप बेस 10 में फ्लोटिंग पॉइंट नंबर कर सकते हैं - यह है कि .NET का decimalप्रकार कैसे काम करता है। दूसरी ओर, निश्चित बिंदु, अलग है। जब तक आपकी सीमा सीमित है, निश्चित बिंदु एक ठीक उत्तर है। लेकिन प्रतिबंधात्मक सीमा कई गणितीय अनुप्रयोगों के लिए निश्चित बिंदु को अनुपयुक्त बनाती है, और निश्चित बिंदु संख्याओं के कार्यान्वयन अक्सर परिणामस्वरूप हार्डवेयर में अच्छी तरह से अनुकूलित नहीं होते हैं।
डैनियल प्राइडेन

जवाबों:


82

ऐसा इसलिए है क्योंकि कुछ अंशों को गोलाई के बिना व्यक्त किए जाने वाले स्थानों की एक बहुत बड़ी (या अनंत) राशि की आवश्यकता होती है। यह दशमलव संकेतन के लिए उतना ही सही है जितना कि बाइनरी या किसी अन्य के लिए। यदि आप अपने गणना के लिए उपयोग करने के लिए दशमलव स्थानों की मात्रा को सीमित करते हैं (और अंश संकेतन में गणना करने से बचते हैं), तो आपको 1/3 + 1/3 के रूप में एक सरल अभिव्यक्ति को भी पूरा करना होगा। परिणामस्वरूप आपको 2/3 लिखने के बजाय आपको 0.33333 + 0.33333 = 0.66666 लिखना होगा जो कि 2/3 के समान नहीं है।

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

फ्लोटिंग-पॉइंट अंकगणित के बारे में हर कंप्यूटर वैज्ञानिक को क्या जानना चाहिए


12
सटीक। लेकिन मैं यह भी ध्यान दूंगा कि दशमलव में समाप्त होने वाली कुछ संख्याएं बाइनरी में समाप्त नहीं होती हैं। विशेष रूप से 0.1 बाइनरी में एक आवर्ती संख्या है और इसलिए कोई भी फ्लोटिंग पॉइंट बाइनरी नंबर बिल्कुल 0.1 का प्रतिनिधित्व नहीं कर सकता है।
जैक ऐडली

4
फ़्लोटिंग पॉइंट केवल बहुत सारे दशमलव स्थानों के लिए उपयोगी नहीं हैं। 32 बिट पूर्णांक केवल लगभग 4 बिलियन तक की गणना कर सकते हैं, लेकिन एक 32 बिट फ्लोट लगभग असीम रूप से बड़ा हो सकता है।
अभि बेकर्ट २ Ab

7
विशेष रूप से, हम परिमित दशमलव के रूप में व्यक्त कर सकते हैं, जिनके भाजक के मुख्य गुणन में केवल 2 और 5 होते हैं (जैसे हम 3/10 और 7/25 व्यक्त कर सकते हैं, लेकिन 11/18 नहीं)। जब हम बाइनरी में जाते हैं, तो हम 5 का कारक खो देते हैं, ताकि केवल डाइएडिक परिमेय (जैसे 1/4, 3/128) को बिल्कुल व्यक्त किया जा सके।
डेविड झांग

70

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

चूँकि केवल एक सीमित संख्या में मान होते हैं जो एक सन्निकटन नहीं होते हैं , और एक सन्निकटन के बीच कोई भी ऑपरेशन और एक सन्निकटन में एक और संख्या परिणाम होता है, गोलाई त्रुटियां लगभग अपरिहार्य हैं

महत्वपूर्ण बात यह है कि जब वे किसी समस्या का कारण बनने की संभावना रखते हैं और जोखिमों को कम करने के लिए कदम उठाते हैं


के अलावा डेविड गोल्डबर्ग की आवश्यक क्या हर कंप्यूटर वैज्ञानिक पता होना चाहिए के बारे में फ्लोटिंग प्वाइंट अंकगणित (सूर्य / ओरेकल द्वारा फिर से प्रकाशित उनके लिए एक परिशिष्ट के रूप संख्यात्मक संगणना गाइड ), जिसके द्वारा उल्लेख किया गया था Thorsten , ACCU पत्रिका अधिभार एक उत्कृष्ट भाग गया फ्लोटिंग पॉइंट ब्लूज़ के बारे में रिचर्ड हैरिस के लेखों की श्रृंखला ।

सिलसिला शुरू हुआ

न्यूमेरिकल कंप्यूटिंग में कई नुकसान होते हैं। रिचर्ड हैरिस सिल्वर बुलेट की तलाश शुरू करता है।

संख्यात्मक त्रुटि के ड्रैगन को अक्सर उसके नींद से दूर नहीं किया जाता है, लेकिन अगर अनायास संपर्क किया जाता है तो वह कभी-कभी अनैच्छिक प्रोग्रामर की गणना पर विनाशकारी नुकसान पहुंचाएगा।

इतना है कि कुछ प्रोग्रामर, IEEE 754 फ़्लोटिंग पॉइंट अंकगणित के जंगलों में उस पर जाप कर रहे हैं, अपने साथियों को उस उचित भूमि में यात्रा करने की सलाह देते हैं।

लेखों की इस श्रृंखला में हम संख्यात्मक कंप्यूटिंग की दुनिया की खोज करेंगे, जिसमें कुछ ऐसी तकनीकों के साथ फ्लोटिंग पॉइंट अंकगणित के विपरीत है, जिन्हें इसके लिए सुरक्षित प्रतिस्थापन के रूप में प्रस्तावित किया गया है। हमें पता चलेगा कि ड्रैगन का क्षेत्र वास्तव में बहुत दूर तक पहुंच रहा है और सामान्य तौर पर हमें सावधानीपूर्वक चलना चाहिए अगर हम उसके विनाशकारी ध्यान से डरते हैं।

रिचर्ड वास्तविक संख्या, तर्कसंगत, तर्कहीन, बीजगणितीय और पारलौकिक के वर्गीकरण की व्याख्या करके शुरू होता है। तब वह IEEE754 प्रतिनिधित्व को समझाने के लिए जाता है, रद्द करने की त्रुटि और निष्पादन समस्याओं के आदेश पर जाने से पहले।

यदि आप इससे अधिक गहराई से नहीं पढ़ते हैं, तो आपके पास फ्लोटिंग पॉइंट नंबरों से जुड़ी समस्याओं में एक उत्कृष्ट ग्राउंडिंग होगी।

यदि आप अधिक जानना चाहते हैं, तो वह जारी है

वह तब आपके कैल्कुलस ब्लूज़ को ठीक करने में आपकी मदद करने की कोशिश कर रहा है

और अंतिम लेकिन कम से कम, वहाँ नहीं है

लेखों की पूरी श्रृंखला अच्छी तरह से देखने लायक है, और कुल 66 पृष्ठों पर, वे अभी भी गोल्डबर्ग पेपर के 77 पृष्ठों से छोटे हैं ।

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


इस प्रकार टिप्पणियों में उल्लिखित ए.के.

उन लेखों के लेखक के रूप में, जिनका मैं उल्लेख करना चाहता हूं कि मैंने अपने ब्लॉग www.thusspakeak.com पर उनके इंटरेक्टिव संस्करण बनाए हैं, जो thusspakeak.com/ak/2013/06 से शुरू होते हैं


1
उन लेखों के लेखक के रूप में, जिनका मैं उल्लेख करना चाहता हूं कि मैंने अपने ब्लॉग www.thusspakeak.com पर उनके इंटरेक्टिव संस्करण बनाए हैं, जो thusspakeak.com/ak/2013/06 से शुरू होते हैं
इस प्रकार

धन्यवाद @ thusspakea.k मैंने अपने उत्तर में एक नोट जोड़ा है, और वे इंटरैक्टिव तत्व बहुत अच्छी तरह से काम करते हैं।
मार्क बूथ

12

खैर, थोरस्टन की निश्चित कड़ी है । मैं जोड़ूंगा:

प्रतिनिधित्व के किसी भी रूप में कुछ संख्या के लिए कुछ गोल त्रुटि होगी। IEEE फ़्लोटिंग पॉइंट या दशमलव में 1/3 को व्यक्त करने का प्रयास करें। न ही सही ढंग से कर सकते हैं। यह आपके प्रश्न का उत्तर देने से परे है, लेकिन मैंने अंगूठे के इस नियम का सफलतापूर्वक उपयोग किया है:

  • उपयोगकर्ता द्वारा दर्ज किए गए मानों को दशमलव में संग्रहीत करें (क्योंकि वे लगभग निश्चित रूप से इसे दशमलव प्रतिनिधित्व में दर्ज करते हैं - बहुत कम उपयोगकर्ता बाइनरी या हेक्स का उपयोग करेंगे)। इस तरह आपके पास हमेशा सटीक उपयोगकर्ता-दर्ज प्रतिनिधित्व है।
  • यदि आपको उपयोगकर्ता-दर्ज किए गए अंशों को संग्रहीत करना है, तो अंश और भाजक को संग्रहीत करें (दशमलव में भी)
  • यदि आपके पास एक ही मात्रा (जैसे सेल्सियस / फ़ारेनहाइट) के लिए माप की कई इकाइयों के साथ एक प्रणाली है, और उपयोगकर्ता दोनों में प्रवेश कर सकता है, तो उनके द्वारा दर्ज किए गए मूल्य को संग्रहीत करें और उनके द्वारा दर्ज की गई इकाइयों को रूपांतरित करने और सहेजने का प्रयास न करें। एकल प्रतिनिधित्व, जब तक आप इसे सटीकता / सटीकता के नुकसान के बिना नहीं कर सकते। सभी गणना में संग्रहीत मूल्य और इकाइयों का उपयोग करें ।
  • आईईईई फ्लोटिंग पॉइंट में स्टोर मशीन जनरेट किया गया मान (यह इलेक्ट्रॉनिक माप उपकरण द्वारा उत्पन्न संख्या हो सकती है, जैसे ए / डी कनवर्टर के साथ एनालॉग सेंसर, या गणना के अनियोजित परिणाम)। ध्यान दें कि यह लागू नहीं होता है यदि आप एक सीरियल कनेक्शन पर सेंसर पढ़ रहे हैं और यह पहले से ही आपको दशमलव प्रारूप में मूल्य दे रहा है (जैसे 18.2 C)।
  • उपयोगकर्ता के देखने योग्य योग आदि को दशमलव में (बैंक खाते के शेष राशि की तरह) स्टोर करें। उचित रूप से गोल करें, लेकिन भविष्य के सभी गणनाओं के लिए निश्चित मूल्य के रूप में उस मूल्य का उपयोग करें।

मैं जोड़ूंगा: ARPREC या decNumber जैसे एक मनमाना-सटीक गणित पैकेज का उपयोग करने पर विचार करें।
ब्लरफ्ल ऑग 15'11

मैं दशमलव (बाइनरी के विपरीत) पूर्णांक मानों के लिए बहुत लाभ नहीं है, जैसे अंश का अंश और हर। या तो सटीक पूर्णांक मान संग्रहीत कर सकते हैं, और बाइनरी अधिक कुशल है। इनपुट और आउटपुट के लिए आगे और पीछे परिवर्तित करने में कुछ लागत है, लेकिन यह शारीरिक रूप से I / O प्रदर्शन करने की लागत से बह जाने की संभावना है।
कीथ थॉम्पसन

10

ऐसा लगता है कि अब तक उल्लेख नहीं किया गया है कि एक अस्थिर एल्गोरिथ्म की अवधारणाएं और एक बीमार स्थिति है । मैं पहले वाले को संबोधित करूंगा, क्योंकि यह नौसिखियों के अंकशास्त्रियों के लिए अधिक लगातार नुकसान होने वाला है।

(पारस्परिक) स्वर्ण अनुपात की शक्तियों की गणना पर विचार करें φ=0.61803…; इसके बारे में जाने का एक संभावित तरीका पुनरावृत्ति फार्मूला का उपयोग करना है φ^n=φ^(n-2)-φ^(n-1), जिसके साथ φ^0=1और शुरू होता है φ^1=φ। यदि आप अपने पसंदीदा कंप्यूटिंग वातावरण में इस पुनर्संरचना को चलाते हैं और परिणामों की सही मूल्यांकन शक्तियों के साथ तुलना करते हैं, तो आपको महत्वपूर्ण आंकड़ों का धीमा क्षरण मिलेगा। यहाँ उदाहरण के लिए गणितज्ञ में क्या होता है :

ph = N[1/GoldenRatio];  
Nest[Append[#1, #1[[-2]] - #1[[-1]]] & , {1, ph}, 50] - ph^Range[0, 51]  
{0., 0., 1.1102230246251565*^-16, -5.551115123125783*^-17, 2.220446049250313*^-16, 
-2.3592239273284576*^-16, 4.85722573273506*^-16, -7.147060721024445*^-16, 
1.2073675392798577*^-15, -1.916869440954372*^-15, 3.1259717037102064*^-15, 
-5.0411064211886014*^-15, 8.16837916750579*^-15, -1.3209051907825398*^-14, 
2.1377864756200182*^-14, -3.458669982359108*^-14, 5.596472721011714*^-14, 
-9.055131861349097*^-14, 1.465160458236081*^-13, -2.370673237795176*^-13, 
3.835834102607072*^-13, -6.206507137114341*^-13, 1.004234127360273*^-12, 
-1.6248848342954435*^-12, 2.6291189633497825*^-12, -4.254003796798193*^-12, 
6.883122762265558*^-12, -1.1137126558640235*^-11, 1.8020249321541067*^-11, 
-2.9157375879969544*^-11, 4.717762520172237*^-11, -7.633500108148015*^-11, 
1.23512626283229*^-10, -1.9984762736468268*^-10, 3.233602536479646*^-10, 
-5.232078810126407*^-10, 8.465681346606119*^-10, -1.3697760156732426*^-9, 
2.216344150333856*^-9, -3.5861201660070964*^-9, 5.802464316340953*^-9, 
-9.388584482348049*^-9, 1.5191048798689004*^-8, -2.457963328103705*^-8, 
3.9770682079726053*^-8, -6.43503153607631*^-8, 1.0412099744048916*^-7, 
-1.6847131280125227*^-7, 2.725923102417414*^-7, -4.4106362304299367*^-7, 
7.136559332847351*^-7, -1.1547195563277288*^-6}

इसके लिए कथित परिणाम φ^41गलत संकेत है, और पहले भी, φ^39साझा और वास्तविक मूल्य साझा करने के लिए सामान्य ( 3.484899258054952* ^ - 9 for the computed version against the true value7.071019424062048 *^-9) में कोई मूल्य नहीं है । इस प्रकार एल्गोरिथ्म अस्थिर है, और किसी को इस अंकगणित सूत्र का उपयोग अधूरा अंकगणित में नहीं करना चाहिए। यह पुनरावर्तन सूत्र की अंतर्निहित प्रकृति के कारण है: इस पुनरावृत्ति के लिए "क्षय" और "बढ़ रहा है" समाधान है, और आगे बढ़ने वाले समाधान द्वारा "क्षय" समाधान की गणना करने की कोशिश कर रहा है जब कोई वैकल्पिक "बढ़ते" समाधान भीख मांग रहा है। संख्यात्मक दु: ख के लिए। इस प्रकार यह सुनिश्चित करना चाहिए कि उसके संख्यात्मक एल्गोरिदम स्थिर हैं।

अब, एक गैर-सशर्त समस्या की अवधारणा पर : भले ही संख्यात्मक रूप से कुछ करने का एक स्थिर तरीका हो, यह बहुत अच्छी तरह से हो सकता है कि आपके पास अभी जो समस्या है वह आपके एल्गोरिथ्म द्वारा हल नहीं की जा सकती है। यह समस्या का दोष है, न कि समाधान पद्धति का। संख्यात्मकता में विहित उदाहरण तथाकथित "हिल्बर्ट मैट्रिक्स" से जुड़े रेखीय समीकरणों का हल है।

हिल्बर्ट मैट्रिक्स

मैट्रिक्स एक बीमार- मैट्रिक्स का विहित उदाहरण है : एक बड़े हिल्बर्ट मैट्रिक्स के साथ एक प्रणाली को हल करने की कोशिश करना एक गलत समाधान वापस कर सकता है।

यहाँ एक गणितीय प्रदर्शन है: सटीक अंकगणित के परिणामों की तुलना करें

Table[LinearSolve[HilbertMatrix[n], HilbertMatrix[n].ConstantArray[1, n]], {n, 2, 12}]
{{1, 1}, {1, 1, 1}, {1, 1, 1, 1}, {1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 
  1}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1,
   1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 
  1, 1, 1, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}}

और अनुभवहीन अंकगणित

Table[LinearSolve[N[HilbertMatrix[n]], N[HilbertMatrix[n].ConstantArray[1, n]]], {n, 2, 12}]
{{1., 1.}, {1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1., 1.},  
  {1., 1., 1., 1., 1., 1.}, {1., 1., 1., 1., 1., 1., 1.}, 
  {1., 1., 1., 1., 1., 1., 1., 1.}, {1., 1., 1., 1., 1., 1., 1., 1., 1.},  
  {1., 1., 1., 0.99997, 1.00014, 0.999618, 1.00062, 0.9994, 1.00031, 
  0.999931}, {1., 1., 0.999995, 1.00006, 0.999658, 1.00122, 0.997327, 
  1.00367, 0.996932, 1.00143, 0.999717}, {1., 1., 0.999986, 1.00022, 
  0.998241, 1.00831, 0.975462, 1.0466, 0.94311, 1.04312, 0.981529, 
  1.00342}}

(यदि आपने इसे मैथेमेटिका में आज़माया है , तो आप कुछ त्रुटि संदेशों को नोट करेंगे जो बीमार कंडीशनिंग की चेतावनी है।)

दोनों मामलों में, केवल सटीकता बढ़ाने से कोई इलाज नहीं है; यह केवल आंकड़ों के अपरिहार्य क्षरण में देरी करेगा।

यह वही है जिसके साथ आपका सामना किया जा सकता है। समाधान मुश्किल हो सकता है: पहले के लिए, या तो आप ड्रॉइंग बोर्ड पर वापस जाते हैं, या पत्रिकाओं / पुस्तकों के माध्यम से उतारा करते हैं / जो कुछ भी खोजने के लिए यदि आपके पास कोई और बेहतर समाधान है; दूसरे के लिए, आप या तो हार मान लेते हैं, या अपनी समस्या को और अधिक सुधारने योग्य बनाते हैं।


मैं आपको डायने ओ'लेरी के एक उद्धरण के साथ छोड़ूंगा:

जीवन हमें कुछ अशिक्षित समस्याओं का सामना कर सकता है, लेकिन अस्थिर एल्गोरिथ्म के लिए बसने का कोई अच्छा कारण नहीं है।


9

क्योंकि आधार 10 दशमलव संख्या को आधार 2 में व्यक्त नहीं किया जा सकता है

या दूसरे शब्दों में 1/10 हर में 2 की शक्ति के साथ एक अंश में नहीं बदला जा सकता है (जो कि अस्थायी रूप से निर्दिष्ट बिंदु उपलब्ध है)


11
बिल्कुल सच नहीं है: 0.5 और 0.25 को आधार 2 में व्यक्त किया जा सकता है। मुझे लगता है कि आपका मतलब "सभी आधार 10 दशमलव संख्याएं नहीं हैं"।
स्कॉट व्हिटलॉक

3
अधिक सटीकता से। सभी आंशिक संख्याओं को एक फ्लोटिंग पॉइंट नोटेशन का उपयोग करके बिल्कुल नहीं दिखाया जा सकता है (अर्थात आधार 2 और आधार 10 दोनों में यह सटीक समस्या है)। कोशिश करो और 9*3.3333333दशमलव में करो और इसे comapre9*3 1/3
मार्टिन यॉर्क

1
यह फ्लोटिंग-पॉइंट भ्रम का सबसे आम स्रोत है। .1 + .1 != .2क्योंकि फ़्लोटिंग-पॉइंट बाइनरी एन्कोडिंग का उपयोग किया जाता है, न कि दशमलव का।
शॉन मैकमिलन

@ सीनमेकिलन: और 1.0/3.0*3.0 != 1.0, क्योंकि फ्लोटिंग-पॉइंट बाइनरी एन्कोडिंग का उपयोग किया जाता है, न कि ट्रिनिटी।
कीथ थॉम्पसन

8

गणित में, अनंत रूप से कई परिमेय संख्याएँ होती हैं। एक 32 बिट चर में केवल 2 32 भिन्न मान हो सकते हैं, और 64 बिट चर केवल 2 64 मान हो सकते हैं। इसलिए, असीम रूप से कई तर्कसंगत संख्याएं हैं जिनका कोई सटीक प्रतिनिधित्व नहीं है।

हम उन योजनाओं के साथ आ सकते हैं जो हमें 1/3 या पूरी तरह से 1/100 का प्रतिनिधित्व करने की अनुमति देंगी। यह पता चला है कि कई व्यावहारिक उद्देश्यों के लिए यह बहुत उपयोगी नहीं है। एक बड़ा अपवाद है: वित्त में, दशमलव अंश अक्सर पॉप अप करते हैं। ऐसा इसलिए है क्योंकि वित्त अनिवार्य रूप से एक मानवीय गतिविधि है, भौतिक नहीं।

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


2
इससे भी बदतर, जबकि स्मृति की एक अनंत (अनंत रूप से अनंत) राशि सभी में से एक का प्रतिनिधित्व करने में सक्षम होगी, यह वास्तविक का प्रतिनिधित्व करने के लिए पर्याप्त नहीं होगा। इससे भी बदतर अभी तक, लगभग सभी वास्तविक संख्याएं गणना योग्य संख्याएं नहीं हैं। स्मृति की एक परिमित मात्रा के साथ हम जो सबसे अच्छा कर सकते हैं वह वास्तविक की सबसे अच्छी सीमा के समीप है।
डेविड हैमेन

4
@ केविन: आप गणना योग्य संख्याओं के बारे में बात कर रहे हैं, जो कि वास्तविकों का एक छोटा उपसमूह (माप शून्य वाला एक उपसमुच्चय) है।
डेविड हैमेन

1
सबसे बुनियादी स्पष्टीकरण के लिए +1: आप एक सीमित संख्या में बिट्स की अनंत संख्या का प्रतिनिधित्व करने की कोशिश कर रहे हैं।
राकु

1
@David Hammen: कम्प्यूटेबल संख्याएँ वास्तविक के एक छोटे उपसमूह (माप शून्य) की होती हैं - लेकिन हर संख्या जो आप कभी भी एक प्रोग्राम में काम करते हैं, परिभाषा के अनुसार, कम्प्यूटेबल होती है।
कीथ थॉम्पसन

3
@ जियोर्जियो: यदि आप सही प्रतिनिधित्व चुनते हैं, तो 2 का वर्गमूल प्रतिनिधित्व करने योग्य है, उदाहरण के लिए, स्ट्रिंग के रूप में "√2"। (मेरा पुराना HP-48 कैलकुलेटर ठीक वैसा ही करने में सक्षम था, और उस मूल्य को चुकता करने का परिणाम हुआ 2.0।) किसी भी परिमित प्रतिनिधित्व के लिए प्रतिनिधित्व करने योग्य वास्तविक संख्याओं की केवल गणना योग्य अनंतता होती है - लेकिन कोई भी गणना एक संख्या नहीं निकाल सकती है, जो नहीं है, सिद्धांत रूप में, प्रतिनिधित्व करने योग्य। व्यवहार में, द्विआधारी फ्लोटिंग-पॉइंट काफी प्रतीकात्मक संख्याओं के सेट को सीमित करता है, जो कि प्रतीकात्मक प्रतिनिधित्व के सापेक्ष धधकती गति और छोटे भंडारण के लाभ के साथ होता है।
कीथ थॉम्पसन

-2

फ्लोटिंग-पॉइंट नंबरों के साथ वास्तव में स्पष्ट "राउंडिंग इश्यू" है जिसके बारे में मुझे लगता है कि चलती औसत फिल्टर के साथ है:

$$ \ start {align} y [n] और = frac {1} {N} \ sum \ limit_ {i = 0} ^ {N-1} x [ni] \ & y [n-1] + \ frac {1} {N} (x [n] - x [nN]) \ \ end {संरेखित} $ $

बिना शोर के बिल्डअप के बिना इस काम को करने के लिए, आप यह सुनिश्चित करना चाहते हैं कि मौजूदा नमूनों में आप जो $ x [n] $ जोड़ते हैं, वह ठीक उसी तरह से हो जैसे $ x [nN] $ आप $ N $ नमूनों को घटाएँगे भविष्य। यदि यह नहीं है, तो जो अलग है वह थोड़ी सी हल्दी है जो आपकी विलंब रेखा में फंस जाती है और कभी बाहर नहीं आएगी। ऐसा इसलिए है क्योंकि यह चलती औसत फिल्टर वास्तव में एक IIR के साथ बनाया गया है जिसमें $ z = 1 $ पर एक मामूली स्थिर ध्रुव है और एक शून्य जो इसे अंदर रद्द करता है। लेकिन, यह एक इंटीग्रेटर है और कोई भी बकवास जो एकीकृत हो जाता है और पूरी तरह से हटाया नहीं जाता है, इंटीग्रेटर योग में हमेशा के लिए मौजूद रहेगा। यह वह जगह है जहाँ फिक्स्ड-पॉइंट में वही समस्या नहीं है जो फ्लोटिंग-पॉइंट नंबर करते हैं।


हे, $ $ laTeX $ गणित में काम नहीं करता Prog.SE फोरम ??? अगर यह वास्तव में लंगड़ा नहीं है।
रॉबर्ट ब्रिस्टो-जॉनसन

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