जब पूर्णांक से एकल में रूपांतरण सटीक खो सकता है


27

जब मैं भाग में आया तो मैं माइक्रोसॉफ्ट से एक लेख पढ़ रहा था, जिसमें बातचीत और विकल्प सख्त थे

निम्नलिखित रूपांतरण सटीक खो सकते हैं:

  • एकल के लिए पूर्णांक
  • सिंगल या डबल तक
  • डेसीमल टू सिंगल या डबल

हालांकि, ये रूपांतरण जानकारी या परिमाण नहीं खोते हैं।

.. लेकिन डेटा प्रकारों के संबंध में एक अन्य लेख के अनुसार ,

  • पूर्णांक प्रकार -2.147.483.648 से 2.147.483.647 तक स्टोर कर सकते हैं

  • सिंगल टाइप से स्टोर कर सकते हैं

    • 1,401298E-45 से 3,4028235E + 38 धनात्मक संख्याओं के लिए,
    • और -3,4028235E + 38 से 1,401298E-45 ऋणात्मक संख्याओं के लिए

.. इसलिए सिंगल इंटेगर की तुलना में अधिक संख्या में स्टोर कर सकता है। मुझे समझ में नहीं आ रहा है कि इंटेगर से सिंगल में ऐसा रूपांतरण किस स्थिति में सटीक हो सकता है। कोई समझा सकता है, कृपया?

जवाबों:


87

इंटीजर की तुलना में सिंगल ज्यादा संख्या में स्टोर कर सकता है

नहीं, यह नहीं हो सकता। दोनों Singleऔर Integer32 बिट हैं, जिसका अर्थ है कि दोनों समान संख्याओं का सटीक संग्रह कर सकते हैं , अर्थात् 2 32 = 4294967296 अलग-अलग संख्याएँ।

के बाद से सीमा की Singleतुलना में स्पष्ट रूप से बड़ा है, यह (की वजह से तुरंत स्पष्ट है डब्बों में सिद्धांत ) है कि यह संभवतः नहीं कर सकता है कि सीमा के भीतर सभी नंबरों को प्रतिनिधित्व करते हैं।

और चूँकि की सीमा Integerअधिकतम आकार की संख्या के समान है, जो दोनों Integerका Singleप्रतिनिधित्व कर सकते हैं और कर सकते हैं, लेकिन Singleउस सीमा के बाहर की संख्याओं का भी प्रतिनिधित्व कर सकते हैं, यह स्पष्ट है कि यह संभवतः सीमा के अंदर सभी संख्याओं का प्रतिनिधित्व नहीं कर सकता है Integer

देखते हैं, तो के कुछ संख्या Integerहै कि में नहीं दर्शाया जा सकता Single, से परिवर्तित Integerकरने के लिए Single करना चाहिए जानकारी को खोने करने में सक्षम हो।


3
+1 इस महान स्पष्टीकरण के लिए कि ऐसा क्यों होना चाहिए, भले ही प्रश्न वास्तव में था जब ("किस स्थिति में") ऐसा होता है ...
DoubleYou

21
@ डबलडॉट: 4294967296 Integers (99.2%) के 4261412864 को इस रूप में प्रस्तुत नहीं किया जा सकता है Single, इसलिए "जब" "हमेशा बहुत सुंदर" होता है।
जॉर्ग डब्ल्यू मित्तग

2
यदि आप अधिक सटीक होना चाहते हैं, तो Singleकेवल 4,278,190,079 विभिन्न संख्याओं का प्रतिनिधित्व कर सकते हैं। एक Singleमान एक संख्या का प्रतिनिधित्व करता है यदि और केवल अगर संग्रहीत घातांक 255 नहीं है, जिसका अर्थ है कि 255 * 2 ^ 24 Singles हैं जो संख्याओं का प्रतिनिधित्व करते हैं। इनमें से, दो समान संख्या (अर्थात् शून्य) का प्रतिनिधित्व करते हैं, और अन्य सभी विभिन्न संख्याओं का प्रतिनिधित्व करते हैं।
टान्नर स्विट

10
en.wikipedia.org/wiki/Single-prepy_floating-point_format IEEE754 बाइनरी 32 के लिए सीमाएँ अच्छी तरह से समझाता है। [-16777216,16777216](2 ^ 24 = महत्व चौड़ाई) में पूर्णांक का प्रतिनिधित्व किया जा सकता है। बड़ी संख्याओं को 2, 4, 8, ... के निकटतम गुणकों में गोल किया जाता है, जो इस बात पर निर्भर करते हैं कि वे कितने बड़े हैं।
पीटर कॉर्ड्स

14
"जिसका अर्थ है कि दोनों समान संख्याओं का सटीक संग्रह कर सकते हैं" - इसका मतलब यह नहीं है कि। इसका केवल यही अर्थ होगा कि यदि दोनों प्रकारों में प्रत्येक संख्या के भंडारण के तरीकों की सटीक समान संख्या है। और यह मामला नहीं है; उदाहरण के लिए, Singleशून्य भंडारण के दो तरीके हैं। तो Singleवास्तव में की तुलना में कम अलग संख्या का प्रतिनिधित्व कर सकते हैं Integer
कोनराड रुडोल्फ

28

फ्लोटिंग पॉइंट प्रकार (जैसे सिंगल और डबल) एक संकेत, एक मंटिसा और एक घातांक द्वारा मेमोरी में दर्शाए जाते हैं। इसे वैज्ञानिक संकेतन के रूप में सोचें:

Sign*Mantissa*Base^Exponent

वे - जैसा कि आप उम्मीद कर सकते हैं - आधार का उपयोग करें 2. ऐसे अन्य मोड़ हैं जो अनन्तता और NaN का प्रतिनिधित्व करने की अनुमति देते हैं, और प्रतिपादक ऑफसेट है (उस पर वापस आ जाएगा), और मंटिसा के लिए एक आशुलिपि (वह भी वापस आ जाएगी) । मानक IEEE 754 के लिए देखें जो अधिक विवरण के लिए इसके प्रतिनिधित्व और संचालन को कवर करता है।

हमारे उद्देश्यों के लिए हम इसे एक बाइनरी नंबर "मंटिसा" के रूप में कल्पना कर सकते हैं, और एक "घातांक" जो आपको बताता है कि दशमलव विभाजक को कहां रखा जाए।


सिंगल के मामले में, हमारे पास उसके हस्ताक्षर के लिए 1 बिट है, घातांक के लिए 8 और मंटिसा के लिए 23 है।

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

The: जब तक हम जो संख्या जमा कर रहे हैं वह शून्य है। उसके लिए हमारे पास सभी बिट्स शून्य पर सेट होंगे। हालाँकि, अगर हम यह बताने की कोशिश करें कि मैंने जो विवरण दिया है, उसके तहत आपके पास 2 ^ 24 (निहितार्थ 1) 1 (गुणक 0 की शक्ति से 2) गुणा होगा। तो, इसे ठीक करने के लिए, एक्सपोनेंट शून्य एक विशेष मूल्य है। प्रतिपादक में अनन्तता और NaN को संग्रहीत करने के लिए विशेष मान भी हैं।

प्रतिपादक ऑफसेट के अनुसार - अलग-अलग मानों को टालने से - इसे ऑफसेट करने के लिए मंटिसा की शुरुआत से पहले या उसके अंत के बाद दशमलव बिंदु को जगह देने की अनुमति मिलती है, बिना घातांक के संकेत के बिना।


इसका मतलब है कि बड़ी संख्या के लिए, फ्लोटिंग पॉइंट प्रकार दशमलव बिंदु को मंटिसा के अंत से परे रखेगा।

याद रखें कि मंटिसा एक 24 बिट संख्या है। यह कभी भी 25 बिट संख्या का प्रतिनिधित्व नहीं करेगा ... इसमें वह अतिरिक्त बिट नहीं है। इस प्रकार, एकल 2 ^ 24 और 2 ^ 24 + 1 के बीच अंतर नहीं कर सकता (ये पहले 25 बिट नंबर हैं, और वे अंतिम बिट पर भिन्न होते हैं, जो एकल में प्रतिनिधित्व नहीं करता है)।

इस प्रकार, पूर्णांकों के लिए एकल की सीमा -2 ^ 24 से 2 ^ 24 है। और 1 से 2 को जोड़ने की कोशिश कर रहा है ^ 24 का परिणाम 2 ^ 24 होगा (क्योंकि जहां तक ​​प्रकार का संबंध है, 2 ^ 24 और 2 ^ 24 + 1 समान मूल्य हैं)। इसे ऑनलाइन आज़माएं । यही कारण है कि पूर्णांक से एकल में परिवर्तित होने पर जानकारी का नुकसान होता है। और यह भी है कि एक लूप जो एक या एक डबल का उपयोग करता है, वह वास्तव में आपके लिए बिना देखे एक अनंत लूप हो सकता है।


यह 1महत्व में निहित प्रमुख बिट का सही विवरण नहीं है । यह पक्षपाती-प्रतिपादक क्षेत्र के गैर-शून्य होने से निहित है । Subnormals (उर्फ denormals) सहित+-0.00 उनके महत्व का एक प्रमुख सा है। मुझे लगता है कि आप 0.0पूरी तरह से विशेष मामले पर विचार करने के लिए सरल बना सकते हैं , लेकिन 0.0वास्तव में अन्य सबऑर्मल के समान एन्कोडिंग नियमों का पालन करते हैं।
पीटर कॉर्ड्स

25

यहाँ जब से परिवर्तित करने की एक वास्तविक उदाहरण है Integerकरने के लिए Singleमई खो परिशुद्धता:

Singleप्रकार -16777216 से 16777216 (सम्मिलित) के लिए सभी पूर्णांकों स्टोर कर सकते हैं, लेकिन यह इस सीमा के बाहर सभी पूर्णांकों की दुकान नहीं कर सकते हैं। उदाहरण के लिए, यह 16777217 नंबर को स्टोर नहीं कर सकता है। इस बात के लिए, यह 16777216 से अधिक किसी भी विषम संख्या को स्टोर नहीं कर सकता है ।

हम Windows PowerShell का उपयोग यह देखने के लिए कर सकते हैं कि यदि हम Integera Singleऔर back को परिवर्तित करते हैं तो क्या होता है :

PS C:\Users\tanne> [int][float]16777213
16777213
PS C:\Users\tanne> [int][float]16777214
16777214
PS C:\Users\tanne> [int][float]16777215
16777215
PS C:\Users\tanne> [int][float]16777216
16777216
PS C:\Users\tanne> [int][float]16777217
16777216
PS C:\Users\tanne> [int][float]16777218
16777218
PS C:\Users\tanne> [int][float]16777219
16777220

ध्यान दें कि 16777217 16777216 के लिए गोल हो गया, और 16777219 16777220 तक गोल हो गया।


4
और बढ़ती परिमाण के साथ, निकटतम प्रतिनिधित्व योग्य floatएस के बीच की दूरी शक्तियों की शक्तियों के रूप में बढ़ती रहती है। en.wikipedia.org/wiki/…
पीटर कॉर्ड्स

12

फ़्लोटिंग पॉइंट प्रकार भौतिकी में "वैज्ञानिक संकेतन" के समान हैं। संख्या एक संकेत बिट, एक घातांक (गुणक) और एक मंटिसा (महत्वपूर्ण अंक) में विभाजित है। इसलिए जैसे-जैसे वैल्यू का परिमाण बढ़ता है, स्टेप साइज भी बढ़ता जाता है।

एकल परिशुद्धता फ़्लोटिंग पॉइंट में 23 मंटिसा बिट्स हैं, लेकिन एक "निहित 1" है, इसलिए मंटिसा प्रभावी रूप से 24 बिट्स है। इसलिए 2 24 तक के परिमाण वाले सभी पूर्णांकों को सटीक रूप से एकल परिशुद्धता फ्लोटिंग पॉइंट में दर्शाया जा सकता है।

ऊपर से क्रमिक रूप से कम संख्याओं का प्रतिनिधित्व किया जा सकता है।

  • 2 24 से 2 25 तक केवल संख्याओं का प्रतिनिधित्व किया जा सकता है।
  • 2 25 से 2 26 तक केवल 4 के गुणक का प्रतिनिधित्व किया जा सकता है।
  • 2 26 से 2 27 तक केवल 8 के गुणक का प्रतिनिधित्व किया जा सकता है।
  • 2 27 से 2 28 तक केवल 16 के गुणक का प्रतिनिधित्व किया जा सकता है
  • 2 28 से 2 29 तक केवल 32 के गुणक का प्रतिनिधित्व किया जा सकता है
  • 2 29 से 2 30 तक केवल 64 के गुणक का प्रतिनिधित्व किया जा सकता है
  • 2 30 से 2 31 तक केवल 128 के गुणक का प्रतिनिधित्व किया जा सकता है

तो 2 32 संभव 32 बिट हस्ताक्षरित पूर्णांक मान केवल 2 * (2 24 + 7 * 2 23 ) = 9 * 2 24 को एकल सटीक फ़्लोटिंग पॉइंट में दर्शाया जा सकता है। जो कि कुल का 3.515625% है।


8

एकल परिशुद्धता फ़्लोट में परिशुद्धता के 24 बिट्स होते हैं। उस पर कुछ भी निकटतम 24-बिट संख्या के लिए गोल है। दशमलव वैज्ञानिक संकेतन में इसे समझना आसान हो सकता है, लेकिन ध्यान रखें कि वास्तविक फ़्लोट्स बाइनरी का उपयोग करते हैं।

मान लें कि आपके पास स्मृति के 5 दशमलव अंक हैं। आप एक नियमित अहस्ताक्षरित इंट की तरह उपयोग करने का विकल्प चुन सकते हैं, जिससे आपको 0 और 99999 के बीच कोई भी संख्या मिल सकती है। यदि आप बड़ी संख्याओं का प्रतिनिधित्व करने में सक्षम होना चाहते हैं, तो आप वैज्ञानिक संकेतन का उपयोग कर सकते हैं और घातांक होने के लिए दो अंकों का आवंटन कर सकते हैं, इसलिए अब आप 0 और 9.99 x 10 99 के बीच किसी भी चीज़ का प्रतिनिधित्व कर सकते हैं ।

हालाँकि, सबसे बड़ी संख्या जिसका आप वास्तव में प्रतिनिधित्व कर सकते हैं वह अब केवल 999 है। यदि आपने 12345 का प्रतिनिधित्व करने की कोशिश की है, तो आप 1.23 x 10 4 , या 1.24 x 10 4 प्राप्त कर सकते हैं, लेकिन आप बीच में किसी भी संख्या का प्रतिनिधित्व नहीं कर सकते, क्योंकि आप पर्याप्त अंक उपलब्ध नहीं हैं।


3
दशमलव अंकों का उपयोग करना एक अच्छा विचार है जो इसे समझना आसान बनाता है, लेकिन अंतिम पैराग्राफ थोड़ा भ्रामक है: वास्तव में आप 999 से अधिक संख्या का प्रतिनिधित्व कर सकते हैं , और आपका उदाहरण यह दिखाता है: 12300 1.23 x 10 <सुप> 4 <sup >। आपका मतलब यह है कि उस संख्या से शुरू होने वाले अंतराल हैं। आप इसे थोड़ा rephrasing मन होगा?
फैबियो का कहना है कि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.