यह काम बिल्कुल भी मामूली नहीं है! यह IEEE फ़्लोटिंग पॉइंट प्रतिनिधित्व की एक संपत्ति है जो int propertyfloor = the है यदि प्रश्न में संख्याओं का परिमाण काफी छोटा है, लेकिन विभिन्न प्रतिनिधित्व संभव हैं जहां int (मंजिल (2.3)) 1 हो सकता है।
यह पोस्ट बताती है कि यह उस रेंज में क्यों काम करता है ।
एक डबल में, आप बिना किसी समस्या के 32 बिट पूर्णांक का प्रतिनिधित्व कर सकते हैं। कोई भी गोल मुद्दे नहीं हो सकते । अधिक सटीक रूप से, डबल्स 2 और 53 और -2 53 सहित सभी पूर्णांकों का प्रतिनिधित्व कर सकते हैं ।
संक्षिप्त विवरण : एक डबल 53 बाइनरी अंक तक संग्रहीत कर सकता है। जब आपको अधिक की आवश्यकता होती है, तो संख्या सही पर शून्य के साथ गद्देदार होती है।
यह इस प्रकार है कि 53 नंबर सबसे बड़ी संख्या है जिसे बिना पैडिंग के संग्रहीत किया जा सकता है। स्वाभाविक रूप से, कम अंकों की आवश्यकता वाले सभी (पूर्णांक) संख्याओं को सटीक रूप से संग्रहीत किया जा सकता है।
एक (111) ( 111) ( 111 वाले) जोड़ने से पैदावार 100 ... 000, (53 शून्य) होती है। जैसा कि हम जानते हैं, हम 53 अंकों को संग्रहीत कर सकते हैं, जो सबसे सही शून्य पैडिंग बनाता है।
यह वह जगह है जहां 2 53 से आता है।
अधिक विस्तार: हमें यह विचार करने की आवश्यकता है कि IEEE-754 फ़्लोटिंग पॉइंट कैसे काम करता है।
1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
संख्या की गणना इस प्रकार की जाती है (विशेष मामलों को छोड़कर जो यहां अप्रासंगिक हैं):
-1 साइन × 1. मंटिसा × 2 एक्सपोनेंट - पूर्वाग्रह
जहां पूर्वाग्रह = 2 घातांक - 1 - 1 , अर्थात 1023 और 127 के लिए क्रमशः डबल / एकल परिशुद्धता।
यह जानते हुए कि 2 एक्स से गुणा करने पर बस सभी बिट्स एक्स स्थानों को बाईं ओर शिफ्ट कर देता है, यह देखना आसान है कि किसी भी पूर्णांक में सभी बिट्स में होना चाहिए जो कि मंटिसा में दशमलव बिंदु के दाईं ओर शून्य तक होता है।
शून्य को छोड़कर किसी भी पूर्णांक में बाइनरी में निम्न रूप है:
1x ... x जहां x -es MSB (सबसे महत्वपूर्ण बिट) के दाईं ओर बिट्स का प्रतिनिधित्व करता है।
क्योंकि हमने शून्य को बाहर रखा है, हमेशा एक एमएसबी होगा जो एक है - यही कारण है कि यह संग्रहीत नहीं है। पूर्णांक को संग्रहीत करने के लिए, हमें इसे पूर्वोक्त रूप में लाना होगा: -1 साइन × 1.mantissa × 2 प्रतिपादक - पूर्वाग्रह ।
यह दशमलव बिंदु पर बिट्स को स्थानांतरित करने के समान है, जब तक कि MSB के बाईं ओर केवल MSB न हो। दशमलव बिंदु के सभी बिट्स को फिर मंटिसा में संग्रहीत किया जाता है।
इससे, हम देख सकते हैं कि हम MSB के अलावा अधिकांश 52 बाइनरी अंकों को संग्रहीत कर सकते हैं।
यह इस प्रकार है कि उच्चतम संख्या जहां सभी बिट स्पष्ट रूप से संग्रहीत हैं
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
इसके लिए, हमें प्रतिपादक को सेट करने की आवश्यकता है, जैसे कि दशमलव बिंदु को 52 स्थानों पर स्थानांतरित किया जाएगा। यदि हम घातांक को एक से बढ़ाते हैं, तो हम दशमलव बिंदु के बाद अंक को बाईं ओर दाईं ओर नहीं जान सकते हैं।
111(omitted)111x.
कन्वेंशन द्वारा, यह 0. है। पूरे मंटिसा को शून्य पर सेट करना, हमें निम्नलिखित संख्या प्राप्त होती है:
100(omitted)00x. = 100(omitted)000.
यह एक 1 है जिसके बाद 53 शून्य, 52 संग्रहीत और 1 जोड़ा गया है।
यह 2 53 का प्रतिनिधित्व करता है , जो सीमा (दोनों नकारात्मक और सकारात्मक) को चिह्नित करता है, जिसके बीच हम सभी पूर्णांकों का सही प्रतिनिधित्व कर सकते हैं। यदि हम एक से 2 53 जोड़ना चाहते हैं , तो हमें निहित शून्य (एक से चिह्नित x
) को एक पर सेट करना होगा , लेकिन यह असंभव है।
math.floor
v2.6 में एक फ्लोट देता है , लेकिन यह v3 में पूर्णांक देता है । इस बिंदु पर (ओपी के लगभग छह साल बाद), यह मुद्दा शायद ही कभी दिखाई दे।