क्यों इतने सारे संख्यात्मक प्रकार (बिट, इंट, फ्लोट, डबल, लॉन्ग) हैं?


9

मैंने PHP, Java और C. सीख लिया है। अब मैं इस बात के लिए उत्सुक हूं कि बिट, इंट, फ्लोट, डबल और लॉन्ग जैसे कई संख्यात्मक डेटा प्रकार क्यों हैं। संख्यात्मक के लिए केवल एक ही प्रकार क्यों नहीं बनाया जाता है?

क्या इससे कोई फायदा है? हो सकता है कि अगर हम पूर्णांक का उपयोग ऐसी छोटी संख्याओं को रखने के लिए करते हैं तो हम स्मृति को बचा सकते हैं?


6
होरसकोल के उत्तर के अलावा: 'फ्लोट' और 'पूर्णांक' प्रकार स्वाभाविक रूप से भिन्न हैं। फ़्लोट्स बहुत बड़ी संख्या पकड़ सकते हैं, लेकिन जैसे-जैसे संख्या का आकार बढ़ता है, परिशुद्धता नीचे जाती है। यह अतिक्रमण इस वजह से है कि जिस तरह से फ्लोट को स्टोर किया जाता है। इसके विपरीत, पूर्णांक में आपके द्वारा संग्रहीत किए जा सकने वाले मानों की श्रेणी काफी सीमित होती है, लेकिन मान हमेशा सटीक होता है, इसलिए आप मूल्यों की तुलना बहुत आसान कर सकते हैं। इसके अलावा, विभाजन के साथ दो अलग-अलग प्रकार के व्यवहार होते हैं - पूर्णांक को 'पूर्णांक' निकटतम पूर्ण संख्या में स्वचालित रूप से, फ्लोट्स नहीं करते हैं। इनमें से प्रत्येक व्यवहार विभिन्न स्थितियों के लिए उपयोगी है।
काम्पू

जावास्क्रिप्ट केवल सतह पर एक नंबर प्रकार है।
एस्लेइजा

@kampu: वास्तव में, कई भाषाओं में, पूर्णांक किसी भी संख्या को स्टोर कर सकते हैं जब तक कि (आभासी) मेमोरी इसे दर्शाने के लिए पर्याप्त बड़ी न हो।
जोर्ग डब्ल्यू मित्तग

1
@ JörgWMittag: हालाँकि, यह प्रश्नकर्ता स्पष्ट रूप से स्थिर भाषाओं के बारे में बात कर रहा है, उदाहरण के लिए पायथन जैसी गतिशील भाषाएं नहीं। CPython स्वयं 'असीमित रेंज' पूर्णांक को 32 बिट की एक सरणी के रूप में कार्यान्वित करता है, प्रत्येक इंट में अंतिम बिट के साथ यह इंगित करने के लिए उपयोग किया जाता है कि क्या अधिक बिट्स हैं। इसके अलावा, पूर्णांक केवल किसी भी पूरे नंबर को स्टोर कर सकते हैं । इसका मतलब है कि अनंत भंडारण के साथ एक फ़्लोट सटीक (अनन्तता एक) के लिए मूल्यों को संग्रहीत कर सकता है, जबकि पूर्णांक मूल्यों को केवल सटीक ( अनंत एलेफ़ शून्य ) तक संग्रहीत कर सकता है ।
kampu

@kampu: चूंकि सभी संख्याओं को बिट्स की श्रृंखला द्वारा दर्शाया जाता है, यहां तक ​​कि अनंत भंडारण के साथ, फ्लोटिंग पॉइंट नंबर और पूर्णांकों के बीच हमेशा एक से एक मैपिंग होगी। इसलिए मुझे नहीं लगता कि कोई सवाल करने के लिए आता है।
से आ

जवाबों:


17

दो कारण हैं कि आपको अलग-अलग संख्यात्मक डेटा प्रकारों से संबंधित होना चाहिए।

1. स्मृति की बचत

for(long k=0;k<=10;k++)
{
    //stuff
}

एक लंबे समय का उपयोग क्यों करें जब यह आसानी से पूर्णांक, या यहां तक ​​कि एक बाइट हो सकता है? आप वास्तव में ऐसा करके स्मृति के कई बाइट्स बचा सकते हैं।

2. फ़्लोटिंग पॉइंट नंबर और पूर्णांक संख्या कंप्यूटर में अलग-अलग संग्रहीत होते हैं

मान लीजिए कि हमारे पास एक पूर्णांक में संग्रहीत संख्या 22 है। कंप्यूटर इस संख्या को बाइनरी में मेमोरी के रूप में संग्रहीत करता है:

0000 0000 0000 0000 0000 0000 0001 0110

यदि आप बाइनरी नंबर सिस्टम से परिचित नहीं हैं, तो इसे वैज्ञानिक संकेतन में दर्शाया जा सकता है: 2 ^ 0 * 0 + 2 ^ 1 * 1 + 2 ^ 2 * 1 + 2 ^ 3 * 0 + 2 ^ 4 * 1 + 2 ^ 5 * 0 + ... + 2 ^ 30 * 0। यह इंगित करने के लिए कि संख्या नकारात्मक है या नहीं (डेटा प्रकार हस्ताक्षरित या अहस्ताक्षरित है) के आधार पर अंतिम बिट का उपयोग किया जा सकता है या नहीं।

अनिवार्य रूप से, यह केवल 2 ^ (बिट स्थान) * मान का योग है।

यह तब बदलता है जब आप दशमलव बिंदु से जुड़े मानों का उल्लेख कर रहे हैं। मान लीजिए कि आपके पास दशमलव में संख्या 3.75 है। इसे बाइनरी में 11.11 के रूप में संदर्भित किया जाता है। हम इसे 2 ^ 1 * 1 + 2 ^ 0 * 1 + 2 ^ -1 * 1 + 2 ^ -2 * 1 या सामान्य रूप से 1.111 * 2 ^ 2 के रूप में एक वैज्ञानिक संकेतन के रूप में दर्शा सकते हैं।

हालाँकि, कंप्यूटर इसे स्टोर नहीं कर सकता है: इसमें बाइनरी पॉइंट (दशमलव बिंदु के बाइनरी नंबर सिस्टम संस्करण) को व्यक्त करने का कोई स्पष्ट तरीका नहीं है। कंप्यूटर केवल 1 और 0 के स्टोर कर सकता है। यह वह जगह है जहाँ फ्लोटिंग पॉइंट डेटा टाइप आता है।

साइज़ोफ़ (फ्लोट) मानकर 4 बाइट्स हैं, तो आपके पास कुल 32 बिट्स हैं। पहले बिट को "साइन बिट" सौंपा गया है। कोई अहस्ताक्षरित फ़्लोट या युगल नहीं हैं। अगले 8 बिट्स का उपयोग "घातांक" के लिए किया जाता है और अंतिम 23 बिट्स को "महत्व" (या कभी-कभी मंटिसा के रूप में संदर्भित) के रूप में उपयोग किया जाता है। 3.75 उदाहरण का उपयोग करते हुए, हमारा घातांक 2 ^ 1 होगा और हमारा महत्व 1.111 होगा।

यदि पहला बिट 1 है, तो संख्या ऋणात्मक है। यदि नहीं, तो सकारात्मक। प्रतिपादक को "पूर्वाग्रह" नामक कुछ द्वारा संशोधित किया जाता है, इसलिए हम घातांक के रूप में बस "0000 0010" को स्टोर नहीं कर सकते हैं। एक एकल सटीक फ्लोटिंग पॉइंट संख्या के लिए पूर्वाग्रह 127 है, और एक डबल परिशुद्धता के लिए पूर्वाग्रह (यह वह जगह है जहां डबल डेटाटाइप को इसका नाम मिलता है) 1023 है। अंतिम 23 बिट्स महत्व के लिए आरक्षित हैं। महत्व केवल हमारे द्विआधारी बिंदु के अधिकार के लिए मूल्य है।

हमारा प्रतिपादक पूर्वाग्रह (127) + प्रतिपादक (1) होगा या बाइनरी में दर्शाया जाएगा

1000 0000

हमारा महत्व होगा:

111 0000 0000 0000 0000 0000

इसलिए, 3.75 को इस रूप में दर्शाया गया है:

0100 0000 0111 0000 0000 0000 0000 0000

अब, चलिए संख्या let's को एक फ्लोटिंग पॉइंट संख्या के रूप में और पूर्णांक संख्या के रूप में देखें:

0100 0001 0000 0000 0000 0000 0000 0000
0000 0000 0000 0000 0000 0000 0000 1000

दुनिया में 8.0 और 8 को जोड़ने वाला कंप्यूटर कैसा है? या यहां तक ​​कि उन्हें गुणा !? कंप्यूटर (विशेष रूप से, x86 कंप्यूटर) में सीपीयू के विभिन्न भाग होते हैं जो फ्लोटिंग पॉइंट नंबर और पूर्णांक संख्या को जोड़ते हैं।


3
3) यद्यपि शायद ही कभी कोई समस्या होती है: कंप्यूटर के शब्दों से बड़े नंबरों पर संचालन धीमा होता है।
लोरेन Pechtel

6

इससे पहले कि हमारे पास गीगाबाइट सिस्टम (या आधुनिक एम्बेडेड सिस्टम जैसे Arduino) था, मेमोरी एक प्रीमियम पर थी और इसलिए एक विशेष संख्या कितनी मेमोरी लेती है यह निर्दिष्ट करने के लिए शॉर्टहैंड विधियों को लागू किया गया था - BIT सीधा है - यह मूल रूप से केवल 1 बिट पर कब्जा करेगा स्मृति का।

अन्य डेटा आकार और नाम सिस्टम के बीच भिन्न होते हैं। 32-बिट सिस्टम पर, INT (या MEDIUMINT) आम तौर पर 2 बाइट्स होंगे, LONGINT 4 बाइट्स होंगे, और SMALLINT एक सिंगल बाइट होगी। 64-बिट सिस्टम में 8-बाइट्स पर LONGINT सेट हो सकता है।

अब भी - विशेष रूप से डेटाबेस अनुप्रयोगों, या कार्यक्रमों में सर्वर पर चलने वाले कई उदाहरण हैं (जैसे वेबसाइटों पर सर्वर साइड स्क्रिप्ट) - आपको जो चुनना है उसके बारे में सावधान रहना चाहिए। 0 और 100 (जो एक बाइट में फिट हो सकते हैं) के बीच मूल्यों को संग्रहीत करने के लिए 2, 4, या 8-बाइट चौड़ा पूर्णांक चुनना अविश्वसनीय रूप से बेकार है यदि आपके पास लाखों रिकॉर्ड के साथ एक डेटाबेस तालिका है।

अधिक जानकारी: https://en.wikipedia.org/wiki/Integer_(computer_science)


अच्छा जवाब +1।
विनय

7
न केवल 'पहले वापस', बल्कि 'अब जब एक प्रणाली छोटी है'। एक डिवाइस पर Arduino एक का आकार किफायती होना चाहिए।
9000

1
क्या सिस्टम केवल एक बिट स्टोर करने के लिए 1 बिट का उपयोग करता है? बिट आमतौर पर सीधे पता करने योग्य नहीं होते हैं
jk।

1
यह बहुत सारे आर्किटेक्चर में सच है - लेकिन बिट्स वास्तव में पुरानी प्रणालियों में सीधे संबोधित करने योग्य थे, और यहां तक ​​कि कुछ और हाल ही में एम्बेडेड सिस्टम (कुछ नियंत्रक जो मैंने केवल 10 साल पहले प्रोग्राम किए थे बिट्स के साथ काम किया था - वे केवल विशिष्ट चौड़ाई के लगभग 64 पता योग्य स्थान थे)। आजकल, मुझे लगता है कि कंपाइलर इसे काम करते हैं और उन्हें बाइट-एरे में डालते हैं।
होरसकॉल

मुझे लगता है कि ओवरराइडिंग का कारक मेमोरी की चिंताओं के बजाय सीपीयू की क्षमता और प्रदर्शन है
जेम्स

4

मेमोरी स्कर्सिटी और प्रिसिजन और रेंज ट्रेड ऑफ के बारे में cpmjr123 के उत्कृष्ट बिंदुओं के अलावा, थ्रेसर भी संभावित रूप से सीपीयू बंद है।

अधिकांश आधुनिक मशीनों में फ्लोटिंग पॉइंट ऑपरेशन करने के लिए विशेष हार्डवेयर होते हैं जिन्हें FPU कहा जाता है। ऐसे सिस्टम भी हैं जिनमें FPU (आजकल ये आमतौर पर छोटे एम्बेडेड डिवाइस हैं) नहीं हैं, परिणामस्वरूप, आपके लक्षित हार्डवेयर के आधार पर, आपको या तो फ़्लोटिंग पॉइंट प्रकार का उपयोग नहीं करना होगा या सॉफ़्टवेयर फ़्लोटिंग पॉइंट लाइब्रेरी का उपयोग नहीं करना होगा। यहां तक ​​कि अगर आपकी मशीन में एफपीयू है, तो ऐतिहासिक रूप से मतभेद थे कि यह किन कार्यों में प्रदान कर सकता है। हार्डवेयर में नहीं किए जाने वाले किसी भी कार्य को सॉफ्टवेयर में किया जाना चाहिए (या टाला जाना चाहिए)

सॉफ्टवेयर में फ्लोटिंग पॉइंट कैलकुलेशन कई सरल ऑपरेशन करके किया जाता है जो हार्डवेयर सपोर्ट करता है। इसलिए आपको एक संभावित गति व्यापार भी बंद मिलता है।


4

शायद सबसे महत्वपूर्ण बात यह है कि वास्तव में तीन अलग-अलग बुनियादी संख्या प्रकार हैं।

पूर्णांक, निश्चित दशमलव और फ्लोटिंग बिंदु।

वे सभी अलग तरह से व्यवहार करते हैं।

7/2 जैसा एक सरल ऑपरेशन उपयोग किए गए डेटा प्रकार के आधार पर 3, 3.50 और 3.499 के उत्तर दे सकता है।

"फिक्स्ड दशमलव" सिंड्रेला प्रकार है, यह केवल कुछ भाषाओं जैसे COBOL और VisualBasic में मूल रूप से समर्थित है। यह कंप्यूटर वैज्ञानिकों के लिए बहुत कम रुचि है, लेकिन किसी भी व्यक्ति के लिए जरूरी है कि वह किसी खाते का सेट जमा करे या किसी इनवॉइस पर बिक्री कर की गणना करे।


मैं उन्हें अलग तरीके से अलग करूंगा: असतत संख्या, अनुमानित संख्या और बीजगणित के छल्ले लपेटना। सी में विशिष्ट उदाहरण होगा int, float, और unsigned intक्रमशः,। फिक्स्ड-पॉइंट प्रकार असतत प्रकार के उपश्रेणी हैं, लेकिन बीजीय रिंग्स संख्याओं से मौलिक रूप से भिन्न हैं [सी में अहस्ताक्षरित प्रकारों के बारे में भ्रम की स्थिति इस तथ्य से है कि वे ज्यादातर संख्याओं के बजाय रिंगों की तरह व्यवहार करते हैं, लेकिन काफी सुसंगत नहीं हैं] ।
सुपरकैट

3

क्या इससे उन्हें कोई फायदा होता है?

बेशक। लाभ हैं। कंप्यूटर की दुनिया में मेमोरी सबसे महत्वपूर्ण बात है। 2kb की स्मृति होने पर क्या उपयोग होता है जब डेटा 1kb से कम में फिट हो सकता है? । अनुकूलन होना चाहिए। यदि आप अधिक मेमोरी का उपयोग करते हैं तो यह स्पष्ट रूप से आपके कंप्यूटर की गति को एक बिंदु पर मार देता है। क्या आपको वास्तव में यह पसंद है? कोई अधिकार नहीं...?

int - 2 bytes (16 bits)

long - 4 bytes (32 bits)

long long - 8 bytes (64 bits)

float - 4 bytes

न केवल मेमोरी, बल्कि संख्या के प्रकार के संगठन भी हैं। उदाहरण के लिए फ्लोटिंग पॉइंट। परिशुद्धता बहुत मायने रखती है और जाहिर है हमारे पास एक प्रकार होना चाहिए जो हमें अधिक सटीक दे सकता है।

यदि हम पुराने दिनों पर विचार करते हैं, तो हमारे पास बहुत कम स्मृति थी जैसा कि आप जानते होंगे। इसे बचाने और बुद्धिमानी से उपयोग करने के लिए हमारे पास ये अंतर थे। और भी बहुत कुछ अगर आप अभी आगे बढ़ते हैं और google के साथ खोज करने की कोशिश करते हैं .. आशा है कि यह मदद करता है।


3

पूर्णांक और वास्तविक (फ्लोट, डबल) संख्याएँ विभिन्न प्रकार के संचालन और आंतरिक गुणों के अलग-अलग प्रकार हैं।

इंटेगर एनेबरेबल हैं लेकिन फ्लोट्स आदि नहीं हैं।

वास्तव में फ्लोट / डबल संख्या एक संरचना है जो दो पूर्णांक फ़ील्ड को जोड़ती है: मंटिसा और एक्सपोनेंट। जटिल संख्या (जिसे आपने विचार से बाहर रखा है) और भी अच्छी तरह से, जटिल हैं।

किसी भी व्यावहारिक भाषा में कम से कम पूर्णांक होना चाहिए और अलग-अलग प्रकारों के रूप में तैरना चाहिए - उन पर बहुत अलग संचालन।


मैं आपके द्वारा उल्लेखित "जटिल संख्या" से परिचित नहीं हूँ। क्या आप आगे बता सकते हैं?
cpmjr123

इसे जांचें: en.wikipedia.org/wiki/Complex_number
c-smile

मुझे a + bi के रूप में जटिल संख्याओं की जानकारी है। मैं अधिक जानकारी के लिए पूछ रहा था कि कंप्यूटर कैसे जटिल संख्याओं को संग्रहीत करता है। मेरी जानकारी के लिए, कोई भी आदिम डेटा प्रकार नहीं हैं जो इसका समर्थन करते हैं।
cpmjr123

जटिल संख्याओं को आम तौर पर दो फ्लोटिंग पॉइंट मानों के रूप में संग्रहीत किया जाता है, अर्थात् उनका a(वास्तविक हिस्सा) और b(काल्पनिक हिस्सा)। सीपीयू आमतौर पर जटिल संख्याओं पर संचालन के लिए मूल समर्थन को लागू नहीं करता है, हालांकि सीपीयू मूल्यों के जोड़े, जैसे (एक बी + सी डी) और (एक बी-सी डी) के संचालन के लिए त्वरित गुणा-जोड़ निर्देश लागू कर सकता है ।
rwong

1
इसके अतिरिक्त, कई भाषाओं के कुछ प्रकार होते हैं जिनका व्यवहार काफी हद तक एक रैपिंग बीजीय रिंग के रूप में परिभाषित किया जाता है (उदाहरण के लिए यदि प्रकार uint16_tका एक वैरिएंट 65535 है, तो इसे बढ़ाकर इसे 0 पर रखा जाएगा)। आदर्श रूप से, भाषाओं में बीजगणित के छल्ले और संख्याओं को दर्शाने के लिए साफ-अलग प्रकार होते हैं ( संख्याएँ जो अतिप्रवाह में फंस जाती हैं, जबकि कोड आसानी से लपेटने की अपेक्षा की जाने वाली चीज़ों पर आसानी से संचालन करने की अनुमति देता है )।
सुपरकाट

-1

इस तथ्य के अतिरिक्त कि फ्लोटिंग-पॉइंट प्रकार पूर्णांक प्रकारों से पूरी तरह से अलग व्यवहार करते हैं, मैं एक अधिक चरम उदाहरण देना चाहता हूं कि प्रति संख्या आकार वास्तव में क्यों मायने रखता है।

कल्पना कीजिए कि आप एक (लंबी) सरणी को क्रमबद्ध करना चाहते हैं। सी में उदाहरण के लिए:

int numbers[100000000];

इसलिए यहां हमारे पास 100 मिलियन नंबर हैं।

यदि प्रत्येक संख्या केवल एक बाइट लंबी है (इसलिए unsigned charइसके बजाय का उपयोग कर int), तो इसके लिए 100 मिलियन बाइट्स की आवश्यकता है।

यदि आप उपयोग करते हैं double, तो यह आमतौर पर प्रति नंबर 8 बाइट्स होते हैं, इसलिए 800 मिलियन बाइट्स की जगह होती है।

इसलिए हर बार जब आप बहुत सी वस्तुओं (इस उदाहरण में संख्या) के साथ काम करते हैं , तो प्रति वस्तु का आकार (इस उदाहरण में प्रति संख्या आकार) वास्तव में मायने रखता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.