इस सवाल का पहले से ही यहाँ एक जवाब है:
चूंकि 32 बिट सिस्टम एक 2 ^ 33 नंबर (क्योंकि स्पष्ट 32-बिट सीमा) का प्रबंधन नहीं कर सकता है, 80-बिट फ्लोटिंग पॉइंट नंबर कैसे प्रबंधित कर सकता है ?
इसे "80-बिट" की आवश्यकता होनी चाहिए ...
इस सवाल का पहले से ही यहाँ एक जवाब है:
चूंकि 32 बिट सिस्टम एक 2 ^ 33 नंबर (क्योंकि स्पष्ट 32-बिट सीमा) का प्रबंधन नहीं कर सकता है, 80-बिट फ्लोटिंग पॉइंट नंबर कैसे प्रबंधित कर सकता है ?
इसे "80-बिट" की आवश्यकता होनी चाहिए ...
जवाबों:
32 बिट CPU का एक अर्थ यह है कि इसके रजिस्टर 32 बिट्स चौड़े हैं। इसका मतलब यह नहीं है कि यह 64 बिट नंबरों के साथ सौदा नहीं कर सकता है, बस इसके लिए निचले 32 बिट आधे से निपटना होगा, फिर ऊपरी 32 बिट आधा सेकंड। (यह सीपीयू का कैरी फ़्लैग है ।) यदि सीपीयू केवल 64 बिट रजिस्टर में मूल्यों को लोड कर सकता है, लेकिन यह अभी भी संभव है तो यह धीमी है।
इस प्रकार, एक सिस्टम की "बिटनेस" जरूरी नहीं कि उन नंबरों के आकार को सीमित कर सकती है जिनसे एक कार्यक्रम निपट सकता है, क्योंकि आप हमेशा उन ऑपरेशनों को तोड़ सकते हैं जो सीपीयू रजिस्टर में फिट नहीं होते हैं। तो यह ऑपरेशन को धीमा कर देता है, अधिक मेमोरी का उपभोग करता है (यदि आपको "स्क्रैडपैड" के रूप में मेमोरी का उपयोग करना है), और प्रोग्राम के लिए अधिक कठिन है, लेकिन ऑपरेशन अभी भी संभव हैं।
हालांकि, उदाहरण के लिए, इंटेल 32 बिट प्रोसेसर और फ्लोटिंग पॉइंट के साथ, इनमें से कोई भी मायने नहीं रखता, क्योंकि सीपीयू के फ्लोटिंग पॉइंट हिस्से के अपने रजिस्टर हैं और वे 80 बिट्स चौड़े हैं। (X86 के इतिहास के आरंभ में, फ्लोटिंग पॉइंट क्षमता एक अलग चिप थी, इसे सीपीयू में 80486TX के साथ एकीकृत किया गया था।)
@ निर्णायक के जवाब ने मुझे इसे जोड़ने के लिए प्रेरित किया।
फ़्लोटिंग पॉइंट वैल्यू, इनफ़ॉफ़र जैसे कि वे FPU रजिस्टरों में संग्रहीत होते हैं, बाइनरी पूर्णांक मानों की तुलना में बहुत अलग काम करते हैं।
फ्लोटिंग पॉइंट वैल्यू के 80 बिट्स को मंटिसा और एक्सपोनेंट के बीच विभाजित किया जाता है (फ्लोटिंग पॉइंट नंबरों में "बेस" भी होता है जो हमेशा 2 होता है)। मंटिसा में महत्वपूर्ण अंक होते हैं, और घातांक निर्धारित करता है कि वे महत्वपूर्ण अंक कितने बड़े हैं। तो दूसरे रजिस्टर में कोई "अतिप्रवाह" नहीं है, यदि आपकी संख्या मंटिसा में फिट होने के लिए बहुत बड़ी हो जाती है, तो आपका घातांक बढ़ जाता है और आप सटीकता खो देते हैं - यानी जब आप इसे पूर्णांक में बदलते हैं, तो आप दाईं ओर से दशमलव स्थानों को खो देंगे - यही कारण है कि इसे फ्लोटिंग पॉइंट कहा जाता है।
यदि आपका घातांक बहुत बड़ा है, तो आपके पास एक फ़्लोटिंग-पॉइंट ओवरफ़्लो है, लेकिन आप इसे आसानी से किसी अन्य रजिस्टर में नहीं बढ़ा सकते हैं क्योंकि एक्सपोनेंट और मंटिसा एक साथ बंधे हैं।
मैं इसमें से कुछ के बारे में गलत और गलत हो सकता हूं, लेकिन मेरा मानना है कि यह इसका सार है। (यह विकिपीडिया लेख उपर्युक्त थोड़ा अधिक स्पष्ट रूप से दिखाता है।)
यह ठीक है कि यह पूरी तरह से अलग तरह से काम करता है क्योंकि सीपीयू का पूरा "फ्लोटिंग-पॉइंट" हिस्सा अपनी ही दुनिया की तरह है - आप इसे और ऐसे एक्सेस करने के लिए विशेष सीपीयू निर्देशों का उपयोग करते हैं। इसके अलावा, प्रश्न के बिंदु की ओर, क्योंकि यह अलग है, एफपीयू की बिटनेस मूल सीपीयू की बिटनेस के साथ कसकर युग्मित नहीं है।
-fomit-frame-pointer
उस रजिस्टर को वापस पाने के लिए उपयोग कर सकते हैं ।
32-बिट, 64-बिट और 128-बिट सभी प्रोसेसर की शब्द लंबाई को संदर्भित करते हैं , जिसे "मौलिक डेटा प्रकार" के रूप में माना जा सकता है। अक्सर, यह सिस्टम की रैम से / को हस्तांतरित बिट्स की संख्या है, और पॉइंटर्स की चौड़ाई (हालांकि अधिक रैम तक पहुंचने के लिए सॉफ़्टवेयर का उपयोग करने से आपको कुछ भी नहीं रोकता है तो एक एकल सूचक क्या एक्सेस कर सकता है)।
एक निरंतर घड़ी की गति (साथ ही साथ वास्तुकला में सब कुछ स्थिर होने) को मानते हुए, और स्मृति को पढ़ना / लिखना एक ही गति है (हम यहां 1 घड़ी चक्र मानते हैं, लेकिन यह वास्तविक जीवन में मामले से बहुत दूर है), आप कर सकते हैं एक 64-बिट मशीन पर एक एकल घड़ी चक्र में दो 64-बिट संख्या जोड़ें (तीन यदि आप रैम से संख्याओं की गणना करते हैं):
ADDA [NUM1], [NUM2]
STAA [RESULT]
हम 32-बिट मशीन पर भी यही गणना कर सकते हैं ... हालाँकि, 32-बिट मशीन पर, हमें सॉफ्टवेयर में यह करने की आवश्यकता है, क्योंकि निचले 32-बिट्स को पहले जोड़ा जाना चाहिए, अतिप्रवाह के लिए क्षतिपूर्ति करना, फिर जोड़ना ऊपरी 64-बिट:
ADDA [NUM1_LOWER], [NUM2_LOWER]
STAA [RESULT_LOWER]
CLRA ; I'm assuming the condition flags are not modified by this.
BRNO CMPS ; Branch to CMPS if there was no overflow.
ADDA #1 ; If there was overflow, compensate the value of A.
CMPS ADDA [NUM1_UPPER], [NUM2_UPPER]
STAA [RESULT_UPPER]
मेरे बनाये हुए असेंबली सिंटैक्स के माध्यम से जा रहे हैं, आप आसानी से देख सकते हैं कि उच्च-सटीक ऑपरेशन कम शब्द लंबाई की मशीन पर कितना लंबा समय ले सकते हैं। यह 64-बिट और 128-बिट प्रोसेसर के लिए वास्तविक कुंजी है: वे हमें एक ही ऑपरेशन में बड़ी संख्या में बिट्स को संभालने की अनुमति देते हैं। कुछ मशीनों में कैरी (जैसे ADC
x86) के साथ अन्य मात्राओं को जोड़ने के निर्देश शामिल हैं , लेकिन ऊपर दिए गए उदाहरण में मनमाने ढंग से सटीक मान हैं।
अब, इस सवाल का विस्तार करने के लिए, यह देखना आसान है कि हम हमारे द्वारा उपलब्ध कराए गए रजिस्टरों की तुलना में बड़ी संख्याओं को कैसे जोड़ सकते हैं - हम समस्या को केवल रजिस्टर के आकार को तोड़ते हैं, और वहां से काम करते हैं। हालाँकि @MatteoItalia द्वारा उल्लेख किया गया है , x87 FPU स्टैक में 80-बिट मात्रा के लिए मूल समर्थन है, सिस्टम में इस समर्थन की कमी है (या प्रोसेसर में एक फ्लोटिंग पॉइंट यूनिट की कमी है!), समकक्ष संगणना / संचालन सॉफ्टवेयर में किया जाना चाहिए ।
इसलिए प्रत्येक 32-बिट सेगमेंट को जोड़ने के बाद 80-बिट संख्या के लिए, 81-बिट बिट में अतिप्रवाह के लिए भी जाँच करेगा, और वैकल्पिक रूप से उच्च क्रम बिट्स को शून्य कर देगा। ये चेक / शून्य स्वचालित रूप से कुछ x86 और x86-64 निर्देशों के लिए किए जाते हैं, जहां स्रोत और गंतव्य ऑपरेंड आकार निर्दिष्ट हैं (हालांकि ये केवल 1 बाइट वाइड से शुरू होने वाली 2 की शक्तियों में निर्दिष्ट हैं)।
बेशक, फ्लोटिंग पॉइंट नंबरों के साथ, कोई भी बाइनरी जोड़ नहीं कर सकता है क्योंकि मंटिसा और महत्वपूर्ण अंक ऑफसेट फॉर्म में एक साथ पैक किए गए हैं। AL86 में एक x86 प्रोसेसर पर, IEEE 32-बिट और 64-बिट फ़्लोट्स के लिए यह प्रदर्शन करने के लिए एक हार्डवेयर सर्किट है; हालाँकि , फ़्लोटिंग-पॉइंट यूनिट (FPU) की अनुपस्थिति में, समान संगणना सॉफ्टवेयर में भी की जा सकती है (जैसे GNU साइंटिफिक लाइब्रेरी के उपयोग के माध्यम से , जो आर्किटेक्चर पर संकलित होने पर FPU का उपयोग करती है , सॉफ़्टवेयर के बैकफ़ॉर्म में वापस आती है। अगर कोई फ्लोटिंग-पॉइंट हार्डवेयर उपलब्ध नहीं है [उदाहरण के लिए एम्बेडेड माइक्रोकंट्रोलर के लिए एफपीयू की कमी है])।
पर्याप्त स्मृति को देखते हुए, कोई व्यक्ति मनमानी (या "अनंत" - यथार्थवादी सीमाओं के भीतर) की संख्या पर गणना कर सकता है। इसका एक कार्यान्वयन जीएनयू मल्टीपल प्रिसिजन लाइब्रेरी में मौजूद है , जो पूर्णांक, तर्कसंगत और फ्लोटिंग पॉइंट ऑपरेशंस पर असीमित परिशुद्धता (जब तक आपकी रैम पूरी नहीं होती है) की अनुमति देता है।
सिस्टम की मेमोरी आर्किटेक्चर आपको केवल एक बार में 32 बिट्स को स्थानांतरित करने की अनुमति दे सकता है - लेकिन यह बड़ी संख्या का उपयोग करने से नहीं रोकता है।
गुणा के बारे में सोचो। आप 10 गुणा तक अपनी गुणन सारणी जान सकते हैं, फिर भी आपको शायद कागज के एक टुकड़े पर 123x321 प्रदर्शन करने में कोई समस्या नहीं है: आप इसे कई छोटी समस्याओं में तोड़ते हैं, व्यक्तिगत अंकों को गुणा करते हैं और कैरी का ध्यान रखते हैं आदि।
प्रोसेसर वही काम कर सकते हैं। "पुराने दिनों" में आपके पास 8 बिट प्रोसेसर थे जो फ्लोटिंग पॉइंट गणित कर सकते थे। लेकिन वे नारेबाजी कर रहे थे।
"32-बिट" वास्तव में प्रोसेसर को वर्गीकृत करने का एक तरीका है, न कि एक सेट-इन-स्टोन सत्तारूढ़। "32-बिट" प्रोसेसर में आमतौर पर काम करने के लिए 32 बिट सामान्य प्रयोजन रजिस्टर होते हैं।
हालांकि, पत्थर की आवश्यकता में कोई सेट नहीं है कि प्रोसेसर में सब कुछ 32-बिट में किया जाए। उदाहरण के लिए, "32-बिट" कंप्यूटर के लिए 28-बिट एड्रेस बस होना अनसुना नहीं था, क्योंकि यह हार्डवेयर बनाने के लिए सस्ता था। 64-बिट कंप्यूटर में अक्सर एक ही कारण के लिए केवल 40-बिट या 48-बिट मेमोरी बस होती है।
फ्लोटिंग पॉइंट अंकगणित एक और जगह है जहाँ आकार भिन्न होते हैं। कई 32-बिट प्रोसेसर ने 64-बिट फ्लोटिंग पॉइंट नंबर का समर्थन किया। उन्होंने विशेष रजिस्टरों में फ्लोटिंग पॉइंट वैल्यू को स्टोर करके ऐसा किया जो सामान्य उद्देश्य रजिस्टरों की तुलना में व्यापक था। विशेष रजिस्टरों में इन बड़े फ्लोटिंग पॉइंट नंबरों में से एक को स्टोर करने के लिए, पहले नंबर को दो सामान्य प्रयोजन रजिस्टरों में विभाजित किया जाएगा, फिर उन्हें विशेष रजिस्टरों में फ्लोट में संयोजित करने के लिए एक निर्देश जारी किया जाएगा। एक बार उन फ़्लोटिंग पॉइंट रजिस्टरों में, मानों को 32-बिट हाफ़ की एक जोड़ी के बजाय 64-बिट फ़्लोट्स के रूप में हेरफेर किया जाएगा।
आपके द्वारा उल्लेखित 80-बिट अंकगणित इस का एक विशेष मामला है। यदि आपने फ्लोटिंग पॉइंट नंबरों के साथ काम किया है, तो आप उन अव्यवस्थाओं से परिचित हैं जो फ्लोटिंग पॉइंट राउंड ऑफ मुद्दों से उत्पन्न होती हैं। राउंडऑफ़ के लिए एक समाधान में अधिक सटीकता के बिट्स हैं, लेकिन फिर आपको बड़ी संख्या में स्टोर करना होगा, और डेवलपर्स को स्मृति में असामान्य रूप से बड़े फ्लोटिंग पॉइंट मान का उपयोग करने के लिए मजबूर करना होगा।
इंटेल समाधान यह है कि फ्लोटिंग पॉइंट रजिस्टर सभी 80 बिट्स हैं, लेकिन उन रजिस्टरों से मानों को स्थानांतरित करने के निर्देश प्राइमरीली 64-बिट संख्याओं के साथ काम करते हैं। जब तक आप इंटेल के x87 फ़्लोटिंग पॉइंट स्टैक के भीतर पूरी तरह से काम करते हैं, तब तक आपके सभी ऑपरेशन 80 बिट्स सटीक के साथ किए जाते हैं। यदि आपके कोड को फ्लोटिंग पॉइंट रजिस्टरों में से किसी एक मान को खींचने और उसे कहीं स्टोर करने की आवश्यकता है, तो यह इसे 64-बिट्स तक काट देता है।
कहानी का नैतिक: "32-बिट" जैसे वर्गीकरण हमेशा खतरनाक होते हैं जब आप चीजों में गहराई से उतरते हैं!
एक "32-बिट" सीपीयू वह है जहां अधिकांश डेटा रजिस्टर 32-बिट रजिस्टर होते हैं, और अधिकांश निर्देश उन 32-बिट रजिस्टरों में डेटा पर काम करते हैं। एक 32-बिट सीपीयू भी एक बार में 32-बिट से मेमोरी को डेटा स्थानांतरित करने की संभावना है। अधिकांश रजिस्टर 32-बिट होने का मतलब यह नहीं है कि सभी रजिस्टर 32-बिट हैं। संक्षिप्त उत्तर यह है कि एक 32-बिट सीपीयू में कुछ विशेषताएं हो सकती हैं जो अन्य बिटकॉन्स का उपयोग करती हैं, जैसे कि 80-बिट फ्लोटिंग पॉइंट रजिस्टर और संबंधित निर्देश।
जैसा कि @spudone ने @ ultrasawblade के उत्तर पर एक टिप्पणी में कहा, एकीकृत फ्लोटिंग-पॉइंट संचालन के लिए पहला x86 CPU इंटेल i486 था (विशेषकर 80486DX लेकिन 80486SX नहीं), जो कि i486 माइक्रोप्रोसेसर प्रोग्रामर के पेज 15-1 के अनुसार था संदर्भ मैनुअल , इसके संख्यात्मक रजिस्टरों में "आठ व्यक्तिगत रूप से-पता लगाने योग्य 80-बिट संख्यात्मक रजिस्टर" शामिल हैं। I486 में 32-बिट मेमोरी बस है, इसलिए 80-बिट मान ट्रांसफर करने पर 3 मेमोरी ऑपरेशन होंगे।
486 पीढ़ी के पूर्ववर्ती, i386 के पास कोई एकीकृत फ्लोटिंग-पॉइंट ऑपरेशन नहीं था। इसके बजाय, इसे बाहरी फ़्लोटिंग पॉइंट "कोप्रोसेसर", 80387 का उपयोग करने के लिए समर्थन था। इस कोप्रोसेसर में लगभग समान कार्यक्षमता थी जिसे i486 में एकीकृत किया गया था, जैसा कि आप 80387 प्रोग्रामर के संदर्भ मैनुअल के पेज 2-1 से देख सकते हैं ।
80-बिट फ़्लोटिंग पॉइंट प्रारूप 8087, 8086 और 8088 के गणित गणक के साथ उत्पन्न हुआ है। 8086 और 8088 16-बिट सीपीयू (16-बिट और 8-बिट मेमोरी बसों के साथ) थे, और अभी भी सक्षम थे 80-बिट फ़्लोटिंग बिंदु प्रारूप का उपयोग करने के लिए, कोपरोसेसर में 80-बिट रजिस्टरों का लाभ उठाकर।