चलो कुछ तैरता डिकोड करते हैं, और देखते हैं कि वास्तव में क्या हो रहा है! मैं आम लिस्प का उपयोग करने जा रहा हूं, जिसमें किसी भी बिट्स को घुमाने के बिना महत्व (ए.के. मंटिसा) और फ्लोटिंग पॉइंट नंबर के एक्सपोनेंट के लिए एक आसान काम है। उपयोग की जाने वाली सभी फ्लोट आईईईई डबल-प्रेसिजन फ्लोट हैं।
चलिए 1e16 देखें।
> (integer-decode-float 1d16)
5000000000000000
1
1
यहां हमारे पास प्रतिनिधित्व (5000000000000000) * 2^1 है। ध्यान दें कि एक अच्छा दौर दशमलव संख्या होने के बावजूद, 2 की शक्ति नहीं है; ऐसा इसलिए है क्योंकि 1e16 2 की शक्ति नहीं है। हर बार जब आप 10 से गुणा करते हैं, तो आप 2 और 5 से गुणा कर रहे हैं; 2 से गुणा करने से केवल एक्सपोनेंट बढ़ रहा है, लेकिन 5 से गुणा करना एक "वास्तविक" गुणा है, और यहां हमने 5 बार गुणा किया है।
5000000000000000 = 10001110000110111100100110111111000001000000000000000 (base 2)
का निरीक्षण करें कि यह एक 53-बिट बाइनरी संख्या है, उसके बाद से दो तैरता एक 53-बिट significand है के रूप में यह होना चाहिए।
लेकिन स्थिति को समझने की कुंजी यह है कि एक्सपोनेंट 1 है। (एक्सपोनेंट छोटा होना एक संकेत है कि हम परिशुद्धता की सीमाओं के करीब आ रहे हैं।) इसका मतलब है कि फ्लोट वैल्यू 2^1 = 2 है बार यह महत्व है।
अब, क्या होता है जब हम इस नंबर में 1 जोड़ने का प्रतिनिधित्व करने का प्रयास करते हैं? खैर, हमें उसी पैमाने पर 1 का प्रतिनिधित्व करने की आवश्यकता है। लेकिन इस संख्या में हम जो छोटा बदलाव कर सकते हैं वह बिल्कुल 2 है, क्योंकि महत्व का कम से कम महत्वपूर्ण महत्व मूल्य 2 है!
है यही कारण है, अगर हम significand को बढ़ा देते, छोटी संभव परिवर्तन करने, हम
5000000000000001 = 10001110000110111100100110111111000001000000000000001 (base 2)
हो और जब हम प्रतिपादक लागू होते हैं, हम 2 * 5000000000000001 = 10000000000000002 मिलता है, जो वास्तव में मूल्य आप मनाया है । आपके पास केवल 10000000000000000 या 10000000000000002 हो सकते हैं, और 10000000000000001.1 बाद के के करीब है।
(ध्यान दें कि यहां समस्या यह भी नहीं है कि दशमलव संख्या बाइनरी में सटीक नहीं है! यहां कोई द्विआधारी "दोहराना decimals" नहीं है, और महत्व के दाहिने सिरे पर 0 बिट्स हैं - यह बस है आपके इनपुट के बड़े करीने से सिर्फ न्यूनतम बिट से परे हो जाता है)
0,1 द्विआधारी चल बिंदु में असीम दोहराता, दशमलव में 1/3 की तरह थोड़े। –
मुझे यह पता है, लेकिन मुझे समझ में नहीं आता कि इससे गोल-बंद व्यवहार का प्रदर्शन कैसे होगा। – jseabold
यह भी ध्यान दें कि Python 2.6 और इससे पहले के परिणाम अलग होंगे। 2.7 में सबसे कम संभव दशमलव स्ट्रिंग दिखाने के लिए एक सुविधा शामिल है (http://docs.python.org/2/whatsnew/2.7.html#other-language-changes)। 2.6 के साथ, पहला परिणाम '10000000000000000.0' –