2008-10-30 15 views
25

फ़्लोटिंग पॉइंट चर का उपयोग करते समय मैंने "त्रुटि" के बारे में सुना है। अब मैं इस पहेली को हल करने की कोशिश कर रहा हूं और मुझे लगता है कि मुझे कुछ गोल/फ़्लोटिंग पॉइंट त्रुटि मिल रही है। तो मैं अंत में फ्लोटिंग पॉइंट त्रुटि की मूल बातें समझने जा रहा हूं।फ़्लोटिंग पॉइंट/राउंडिंग त्रुटि का एक सरल उदाहरण क्या है?

फ़्लोटिंग पॉइंट/राउंडिंग त्रुटि (अधिमानतः सी ++ में) का एक सरल उदाहरण क्या है?

संपादित करें: उदाहरण के लिए कहें कि मेरे पास एक ऐसा ईवेंट है जिसमें सफल होने की संभावना पी है। मैं इस घटना को 10 बार करता हूं (पी नहीं बदलता है और सभी परीक्षण स्वतंत्र होते हैं)। वास्तव में 2 सफल परीक्षणों की संभावना क्या है? मैंने इसे कोड किया है:

double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2); 

क्या यह फ़्लोटिंग पॉइंट त्रुटि का अवसर है?

+0

मुझे लगता है कि आप वास्तव में क्या जरूरत है यह है: (http://docs.sun.com/source/ [हर कंप्यूटर वैज्ञानिक के बारे में फ्लोटिंग प्वाइंट अंकगणित क्या पता होना चाहिए] 806-3568/ncg_goldberg.html)। – Patrick

+0

इसे पढ़ें: http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 –

+0

सरल जावा उदाहरण देखें, शूलड सी में समान हो: http://stackoverflow.com/ ए/157 9 0782/25410 9 – xmedeko

उत्तर

9

आम तौर पर, फ्लोटिंग पॉइंट त्रुटि उस समय को संदर्भित करती है जब आईईईई फ्लोटिंग पॉइंट प्रस्तुति में कोई नंबर संग्रहीत नहीं किया जा सकता है।

इंटीग्रर्स दाएं-सबसे छोटे होने के साथ संग्रहीत किए जाते हैं, और प्रत्येक बिट बाईं ओर डबल होता है (2,4,8, ...)। यह देखना आसान है कि यह किसी भी पूर्णांक को 2^एन तक स्टोर कर सकता है, जहां n बिट्स की संख्या है।

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

इस प्रकार, 0.5 (1/2) जैसी संख्याएं स्टोर करना आसान है, लेकिन प्रत्येक नंबर < 1 फॉर्म 1/2, 1/4, 1/8 के निश्चित अंशों को जोड़कर बनाया जा सकता है, ...

एक वास्तव में सरल उदाहरण 0.1 या 1/10 है। यह एक अनंत श्रृंखला के साथ किया जा सकता है (जिसे मैं वास्तव में काम करने पर परेशान नहीं कर सकता), लेकिन जब भी कंप्यूटर 0.1 स्टोर करता है, तो यह वास्तव में यह संख्या संग्रहीत नहीं होती है।

आप एक यूनिक्स मशीन के लिए उपयोग किया है, तो यह इस देखना आसान है:।

Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 0.1 
0.10000000000000001 
>>> 

आप तैरता और युगल के साथ समानता परीक्षण के साथ वास्तव में सावधान रहना चाहता हूँ, जो कुछ भी भाषा में आप में हैं

(आपके उदाहरण के लिए, 0.2 उन अजीब संख्याओं में से एक है जिसे आईईईई बाइनरी में संग्रहीत नहीं किया जा सकता है, लेकिन जब तक आप समानता के बजाय असमानताओं का परीक्षण कर रहे हैं, जैसे पी < = 0.2, तो आप ठीक होंगे ।)

5

एक साधारण सी जो गले लगाता है मुझे हिंदुस्तान टाइम्स एक समय पहले,

char *c = "90.1000"; 
double d = 0; 
sscanf(c,"%f",&d); 
printf("%0.4f",d); 

>> 90.0999 

यह एक समारोह है कि रेडियंस, जो उपरोक्त मामले में ऐसा नहीं किया करने के लिए डीएमएस में कोण परिवर्तित में था।
enter image description here
और आप इस तरह XY ग्राफ (एक्स और वाई लघुगणकीय पैमाने में हैं) मिल जाएगा: समीकरण f(k) आकर्षित करने के लिए प्रयास करें -

+2

एक अज्ञात उपयोगकर्ता के रूप में इंगित किया गया है, 'एसएसकेएनएफ' के साथ "एफ" रूपांतरण विनिर्देशक को 'फ्लोट' तर्क की आवश्यकता होती है, न कि 'डबल' (हालांकि, "एफ" का मतलब 'print' से 'printf' है - - हाँ यह भ्रमित है)। "एलएफ" संशोधित रूपांतरण विनिर्देश का उपयोग 'sscanf' को 'डबल' के साथ काम करने के लिए किया जाना चाहिए। –

26
for(double d = 0; d != 0.3; d += 0.1); // never terminates 
19

चित्र एक हजार शब्दों के लायक है।
enter image description here
यदि कंप्यूटर त्रुटि के बिना 32-बिट फ्लोट का प्रतिनिधित्व कर सकता है तो प्रत्येक k के लिए हमें शून्य प्राप्त करना चाहिए। लेकिन फ्लोटिंग पॉइंट त्रुटि संचय की वजह से के के बड़े मानों के साथ त्रुटि बढ़ जाती है।

hth!

3

यहां एक है जिसने मुझे पकड़ा।

round(256.49999) == 256 
roundf(256.49999) == 257 

डबल्स और तैरता ..

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