तथ्य यह है कि 32 बिट्स का उपयोग करके एक फ्लोट और एक int का प्रतिनिधित्व किया जाता है। पूर्णांक मान सभी 32 बिट्स का उपयोग करता है ताकि यह -2 से 2 -1 से संख्याओं को समायोजित कर सके। हालांकि, एक फ्लोट एक्सपोनेंट के लिए साइन ((0.0 एफ सहित) और 8 बिट्स के लिए 1 बिट का उपयोग करता है। साधन 32 - 9 = 23 बिट्स मंटिसा के लिए छोड़ दिया। हालांकि, फ्लोट मानता है कि अगर मंटिसा और एक्सपोनेंट शून्य नहीं है, तो मंटिसा 1 से शुरू होता है। इसलिए 32 के बजाए आपके पूर्णांक के लिए 24 बिट्स कम या कम हैं। हालांकि, क्योंकि इसे स्थानांतरित किया जा सकता है, यह और अधिक समायोजित करता है 2 पूर्णांक से अधिक।
A floating point uses a Sign, an eXponent, and a Mantissa
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
An integer has a Sign, and a Mantissa
S M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M
तो, एक पूर्णांक जैसे:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
एक नाव में फिट बैठता है, क्योंकि यह स्थानांतरित किया जा सकता:
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
| | |
| +---------+ +---------+
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
मैं तुम्हें प्रतिपादक क्योंकि मैं सबसे अक्सर दिखाई नहीं देते इसे कंप्यूटिंग में गलती करें, लेकिन यह 5 (या -5?) जैसा होना चाहिए क्योंकि मैंने 5 बिट्स द्वारा स्थानांतरित किया है (लेकिन आपको 128 जोड़ना या घटाना होगा ...)। यह आपको स्पष्ट रूप से दिखाता है कि यदि आपको 5 बिट्स द्वारा स्थानांतरित करना है, तो आप 5 निचले बिट्स खोने जा रहे हैं।
तो इस अन्य पूर्णांक को 2 बिट्स के खोने के साथ एक फ्लोट में परिवर्तित किया जा सकता है (यानी जब आप एक पूर्णांक में वापस परिवर्तित होते हैं, तो अंतिम दो बिट्स (11) शून्य (00) पर सेट होते हैं क्योंकि वे सहेजे नहीं गए थे फ्लोट):
1 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1
| | | | | | | |
| +---------+ +---------+ +-+-+-+-+--> all lost
| | |
v v v
S X X X X X X X X M M M M M M M M M M M M M M M M M M M M M M M
1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0
वास्तव में बहुत सरल सामान।
महत्वपूर्ण नोट: हाँ, पूर्णांक में पहला 1 संकेत है, तो अगले 1 को मंटिसा में कॉपी नहीं किया गया है, यह 1 माना जाता है इसलिए इसकी आवश्यकता नहीं है।
आपके विशिष्ट मुद्दे से कोई लेना देना नहीं है, लेकिन अगर आपको लगता है कि फ्लोट्स किसी भी तरह से युगल से तेज हो सकते हैं, तो आप गलत हैं - फ्लोट का उद्देश्य भंडारण आवश्यकताओं को कम करना है, जो कि आधुनिक अनुप्रयोगों के लिए शायद ही कभी एक समस्या है। डेटा प्रकार की आपकी डिफ़ॉल्ट पसंद डबल होना चाहिए, फ्लोट नहीं होना चाहिए। –
@Neil: यह सीपीयू पर बहुत निर्भर करता है। कई आर्किटेक्चर हैं जहां फ्लोट डबल से नाटकीय रूप से तेज़ है। – jalf
@jalf संभव है, लेकिन सी या सी ++ कोड में ज्यादातर स्थितियों में, फ्लोट को वैसे भी डबल्स में पदोन्नत किया जाएगा। –