मौलिक गणित का प्रोग्रामिंग भाषाओं द्वारा कुशलतापूर्वक मूल्यांकन कैसे किया जाता है?


22

जैसा कि मैं प्रोग्रामिंग के पीछे सिद्धांत के साथ अधिक से अधिक शामिल हूं, मैं खुद को मोहित लगता हूं और प्रतीत होता है कि सरल चीजों से गूंगा हूं। मुझे एहसास है कि अधिकांश बुनियादी प्रक्रियाओं के बारे में मेरी समझ परिपत्र तर्क के माध्यम से उचित है

प्रश्न : यह कैसे काम करता है?

A : क्योंकि यह करता है!

मुझे इस अहसास से नफरत है! मुझे ज्ञान से प्यार है, और इसके अलावा मुझे सीखना बहुत पसंद है, जो मुझे मेरे प्रश्न की ओर ले जाता है (यद्यपि यह एक व्यापक है)।

सवाल:

प्रोग्रामिंग भाषाओं के साथ मौलिक गणितीय ऑपरेटरों का आकलन कैसे किया जाता है?

वर्तमान तरीकों को कैसे बेहतर बनाया गया है?

उदाहरण

var = 5 * 5; 

मेरी व्याख्या:

$num1 = 5; $num2 = 5; $num3 = 0;
while ($num2 > 0) {
    $num3 = $num3 + $num1;
    $num2 = $num2 - 1;
}
echo $num3;

यह अत्यधिक अक्षम प्रतीत होता है। उच्चतर कारकों के साथ, यह विधि बहुत धीमी है जबकि विधि में निर्मित मानक तत्काल है। आप बिना जोड़-घटाव के गुणन का अनुकरण कैसे करेंगे?

var = 5 / 5;

यह भी कैसे किया जाता है? मैं सचमुच इसे 5 में 5 बराबर भागों में विभाजित करने का एक तरीका नहीं सोच सकता।

var = 5 ^ 5; 

इसके अलावा पुनरावृत्तियों के परिवर्तन? मेरी व्याख्या:

$base = 5;
$mod = 5;
$num1 = $base;
while ($mod > 1) {

    $num2 = 5; $num3 = 0;
    while ($num2 > 0) {
        $num3 = $num3 + $num1;
        $num2 = $num2 - 1;
    }
    $num1 = $num3;
    $mod -=1;
}
echo $num3;

फिर, यह बेहद अक्षम है, फिर भी मैं ऐसा करने का दूसरा तरीका नहीं सोच सकता। यह वही सवाल गणितीय संबंधित सभी कार्यों तक फैला हुआ है जो स्वचालित रूप से नियंत्रित किए जाते हैं।


1
मुझ पर थोड़ा सा बैकस्टोरी, मैं कंप्यूटर विज्ञान के लिए कॉलेज जा रहा हूं, और बाद में जीवन गणितीय सिद्धांत और साथ ही संभवतः दर्शन और सैद्धांतिक भौतिकी। कई आकांक्षाएं, बहुत कम समय।
कोर्विन सोंटो

10
क्या यह मान लेना सुरक्षित है कि आपने en.wikipedia.org/wiki/Category:Computer_arithmetic के सभी लिंक देखे हैं ?
जेबी किंग

2
मौलिक रूप से, यह इसी तरह है कि आपको प्राथमिक विद्यालय में बहु-अंक गुणा और लंबे विभाजन को कैसे सिखाया जाता है। A का एक अंक लीजिए, B. Shift को दस से गुणा करें। A का अगला अंक लें, B. द्वारा सभी अंकों के लिए गुणा करें, इसे सभी को एक साथ जोड़ें। क्योंकि यह द्विआधारी है, एकल अंक गुणन सरल है (यह या तो x0 या X1 है) और दस से शिफ्ट करने के बजाय, आप दोगुना हो जाते हैं। विभाजन समान है।
मोनिका

जवाबों:


35

वास्तव में यह समझने के लिए कि एक कंप्यूटर के अंदर अंकगणित कैसे काम करता है जिसे आपको विधानसभा भाषा में प्रोग्राम करना होगा। अधिमानतः एक छोटे शब्द आकार के साथ और गुणन और विभाजन निर्देशों के बिना। 6502 जैसा कुछ।

6502 पर, लगभग सभी अंकगणित को एक रजिस्टर में किया जाता है जिसे Accumulator कहा जाता है। (एक रजिस्टर प्रोसेसर के अंदर एक विशेष मेमोरी लोकेशन है जिसे जल्दी से एक्सेस किया जा सकता है।) इसलिए दो नंबर जोड़ने के लिए, आप पहले नंबर को एक्यूमुलेटर में लोड करते हैं, फिर उसमें दूसरे नंबर को जोड़ते हैं।

लेकिन यह ओवरसिंपलिंग है। क्योंकि 6502 एक 8-बिट प्रोसेसर है, यह केवल 0 से 255 तक संख्याओं को संभाल सकता है। अधिकांश समय आप बड़ी संख्या के साथ काम करने में सक्षम होना चाहेंगे। आपको इन्हें एक बार में 8 बिट्स में जोड़ना होगा। प्रोसेसर में एक कैरी फ्लैग होता है जो तब सेट होता है जब दो नंबर जोड़ने का परिणाम Accumulator को ओवरफ्लो करता है। प्रोसेसर जोड़ता है कि जब एक अतिरिक्त कर रहे हैं, तो इसका उपयोग "1 ले जाने" के लिए किया जा सकता है, यह मानते हुए कि आप एक नंबर के निम्नतम-क्रम बाइट के साथ शुरू करते हैं। 6502 पर एक मल्टी-बाइट ऐड इस तरह दिखता है:

  1. क्लियर कैरी फ्लैग (CLC)
  2. पहले नंबर का लोड-ऑर्डर-बाइट लोड करें (LDA, लोड संचायक)
  3. दूसरे नंबर के सबसे कम-ऑर्डर-बाइट जोड़ें (एडीसी, कैरी के साथ जोड़ें)
  4. परिणाम के निम्नतम-क्रम बाइट को स्टोर करें (STA, स्टोर संचयकर्ता)
  5. क्रमिक रूप से उच्च-क्रम बाइट्स के साथ चरण 2-4 दोहराएं
  6. यदि अंत में, कैरी सेट है, तो आप ओवरफ्लो हो गए हैं; उचित कार्रवाई करें, जैसे कि एक त्रुटि संदेश (BCS / BCC, शाखा यदि सेट / स्पष्ट हो तो)

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

लेकिन रुकें! नकारात्मक संख्याओं के बारे में क्या? खैर, 6502 के साथ इन्हें दो के पूरक नामक प्रारूप में संग्रहीत किया जाता है। 8-बिट संख्या मानकर, -1 को 255 के रूप में संग्रहीत किया जाता है, क्योंकि जब आप 255 को किसी चीज़ में जोड़ते हैं, तो आपको एक्यूमुलेटर में एक कम (प्लस ए कैरी) मिलता है। -2 को 254 और इतने पर, -128 के नीचे सभी तरह से संग्रहीत किया जाता है, जिसे 128 के रूप में संग्रहीत किया जाता है। इसलिए हस्ताक्षरित पूर्णांकों के लिए, बाइट की आधी 0-255 रेंज सकारात्मक संख्याओं के लिए और आधी नकारात्मक संख्याओं के लिए उपयोग की जाती है। (यह कन्वेंशन आपको यह देखने के लिए की संख्या के उच्च बिट की जांच करने देता है कि क्या यह नकारात्मक है।)

इसे 24 घंटे की घड़ी की तरह समझें: 23 को जोड़ने से समय एक घंटे पहले (अगले दिन) हो जाएगा। तो 23 घड़ी -1 के समकक्ष मॉड्यूलर है।

जब आप 1 से अधिक बाइट का उपयोग कर रहे हैं तो आपको नकारात्मक के लिए बड़ी संख्या का उपयोग करना होगा। उदाहरण के लिए, 16-बिट पूर्णांक में 0-65536 की सीमा होती है। तो 65535 का उपयोग -1 का प्रतिनिधित्व करने के लिए किया जाता है, और इसी तरह, क्योंकि किसी भी संख्या में 65535 को एक कम (प्लस ए कैरी) में जोड़ा जाता है।

6502 पर केवल चार अंकगणितीय ऑपरेशन हैं: जोड़ना, घटाना, दो से गुणा करना (शिफ्ट बाएं), और दो से विभाजित करना (शिफ्ट राइट)। बाइनरी में काम करते समय केवल इन ऑपरेशनों का उपयोग करके गुणा और विभाजन किया जा सकता है। उदाहरण के लिए, 5 (बाइनरी 101) और 3 (बाइनरी 11) को गुणा करने पर विचार करें। दशमलव लंबे गुणा के साथ, हम गुणक के सही अंक से शुरू करते हैं और 1 से 101 गुणा करते हैं, 101 देते हैं। फिर हम छोड़ दिए गए गुणक को 1 से बढ़ाते हैं और 1010 से 1010 गुणा करते हैं। फिर हम इन परिणामों को एक साथ जोड़ते हैं, 1111 या 15. चूंकि हम कभी भी केवल 1 या 0 से गुणा कर रहे हैं, हम वास्तव में गुणा नहीं करते हैं; गुणक के प्रत्येक बिट बस एक ध्वज के रूप में कार्य करता है जो हमें बताता है कि क्या (स्थानांतरित) गुणक को जोड़ना है या नहीं।

डिवीजन बाइनरी को छोड़कर ट्रायल डिवाइडर का उपयोग करते हुए मैनुअल लॉन्ग डिवीजन के अनुरूप है। यदि आप एक स्थिरांक से विभाजित कर रहे हैं, तो इसे घटाना के अनुरूप एक प्रकार से करना संभव है: X से विभाजित करने के बजाय, आप 1 / X के एक पूर्वगामी प्रतिपादन से गुणा करते हैं जो वांछित परिणाम और एक अतिप्रवाह पैदा करता है। आज भी यह विभाजन से तेज है।

अब असेंबली में फ्लोटिंग-पॉइंट गणित करने की कोशिश करें, या फ़्लोटिंग-पॉइंट नंबरों को असेंबली में अच्छे आउटपुट फॉर्मेट में बदलने का प्रयास करें। और याद रखें, यह 1979 है और घड़ी की गति 1 मेगाहर्ट्ज है, इसलिए आपको इसे यथासंभव कुशलता से करना चाहिए।

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


3
अरे, आपके बहुत विस्तृत विवरण के लिए धन्यवाद! यह वही है जो मैं चाहता था! मेरे स्तर पर होने के नाते, आप अक्सर यह भूल जाते हैं कि जो आप का समर्थन कर रहे हैं वह आम तौर पर आपके द्वारा किए जा रहे किसी भी काम से अधिक जटिल है। यही कारण है कि मैं कंप्यूटर विज्ञान का अध्ययन करना चाहता हूं। मुझे इस तथ्य से नफरत है कि अगर मैं समय पर वापस जाने के लिए था, तो मुझे कुछ भी नहीं पता है कि दुनिया बदल रही है, बस एक उचित एसक्यूएल बयान कैसे तैयार किया जाए;) किसी भी दर पर, इस उत्तर को लिखने के लिए समय बिताने के लिए बहुत-बहुत धन्यवाद; आपने मुझे एक स्वाद परीक्षक दिया है जिसमें मैं तल्लीन हूँ।
कोर्विन सोंटो

7
असहमति, असेंबली अभी भी बहुत अधिक है, अगर आप जानना चाहते हैं कि कंप्यूटर कैसे अंकगणित करते हैं, तो आपको हार्डवेयर, या कम से कम हार्डवेयर एल्गोरिदम
जे.के.

एह। एक बार जब आप जानते हैं कि योजक और शिफ्टर्स हैं, तो उन्हें सॉफ्टवेयर द्वारा नियंत्रित हार्डवेयर के रूप में कल्पना करना आसान है, और सॉफ्टवेयर के साथ खेलना आसान है।
थोड़े से

4
-1। हार्डवेयर को कई बार शिफ्ट के साथ नहीं किया गया है और अब लगभग 3 दशकों तक जोड़ा जाता है, और कई सीपीयू एक चक्र में एक गुणा कर सकते हैं। Binary Multiplierविवरण के लिए विकिपीडिया लेख देखें।
मेसन व्हीलर

24

अंत में, हार्डवेयर में बुनियादी अंकगणितीय ऑपरेशन किए जाते हैं। अधिक विशेष रूप से, सीपीयू में (या वास्तव में, एक उपपरिवार)

दूसरे शब्दों में, यह इलेक्ट्रॉनिक सर्किट है। उपयुक्त बिट्स को इनपुट के रूप में सेट करें और आपको आउटपुट के रूप में उपयुक्त बिट्स मिलेंगे। यह बुनियादी लॉजिक गेट्स का संयोजन है।

http://en.wikipedia.org/wiki/Adder_%28electronics%29

http://en.wikipedia.org/wiki/Binary_multiplier


3
हार्डवेयर के लिए एल्गोरिदम सावधानी से निर्दिष्ट किए जाते हैं और हार्डवेयर से अलग अध्ययन किया जा सकता है।
S.Lott

@ S.Lott: मुझे आपकी टिप्पणी भ्रामक लगती है। मेरे लिए, एल्गोरिदम आपके द्वारा अनुसरण किए जाने वाले चरणों की एक श्रृंखला को शामिल करता है, एक प्रक्रिया, कुछ जिसे आप प्रोग्राम कर सकते हैं। यहां, हम इलेक्ट्रॉनिक सर्किटों के बारे में बात कर रहे हैं जो बुनियादी अंकगणितीय ऑपरेशन कर रहे हैं। दूसरे शब्दों में, गेट्स का एक सिक्वेंस जहां करंट प्रवाहित होता है। तो यह "एल्गोरिथम" की तुलना में अधिक "तार्किक" है। ... मेरे 2 सेंट।
डेगनलीज

6
एक एल्गोरिथ्म "परिमित, निश्चित और प्रभावी" है यह सर्किट में हो सकता है, या कागज और पेंसिल के साथ किया जा सकता है, या किसी डिश या डीएनए में टिंचर्टॉयस या अणुओं के साथ किया जा सकता है। एल्गोरिथम कुछ भी हो सकता है। एक इलेक्ट्रॉनिक सर्किट को एक परिभाषित एल्गोरिथ्म का पालन करना चाहिए। यह जादुई रूप से एल्गोरिदम की आवश्यकता को पूरा नहीं करता है।
S.Lott

1
क्या एक प्रक्रिया जिसमें केवल एक कदम पर एक "एल्गोरिथम" माना जाएगा? एफडब्ल्यूआईडब्ल्यू, इलेक्ट्रॉनिक सर्किट आम ​​तौर पर एक सत्य तालिका का पालन करते हैं - एक एकल चरण प्रसंस्करण। यह कि सत्य तालिका बहुस्तरीय फाटकों में "संकलित" हो रही है, इस तथ्य को नकारती नहीं है कि यह एक एकल चरण प्रक्रिया है।
स्लीपबेटमैन

2
@ S.Lott: एक अधिक उपयुक्त पहली टिप्पणी होगी: हार्डवेयर के "तर्क" को सावधानीपूर्वक निर्दिष्ट किया गया है और हार्डवेयर से अलग अध्ययन किया जा सकता है। और वास्तव में यह है। द्विआधारी तर्क के अध्ययन को बूलियन बीजगणित कहा जाता है।
स्लीपबेटमैन

6

यह सब डॉन नेथ के द आर्ट ऑफ कंप्यूटर प्रोग्रामिंग में पूरी तरह से धैर्य के साथ कवर किया गया है।

जोड़, घटाना, गुणा और भाग के लिए कुशल एल्गोरिदम सभी को पूर्ण विवरण में वर्णित किया गया है।

आप इस तरह की चीजों को पढ़ सकते हैं जो विभाजन को अच्छी तरह से कवर करते हैं।

http://research.microsoft.com/pubs/151917/divmodnote.pdf


5

यह इलेक्ट्रॉनिक सर्किट द्वारा पिकोसेकंड में किया जाता है। विवरण के लिए Google 'हार्डवेयर गुणक' आदि। दशकों के निरंतर सुधार के आधुनिक सीपीयू अत्यंत जटिल परिणाम हैं।

BTW, चूंकि आप बार-बार जोड़कर गुणा नहीं करते हैं, तो आप कंप्यूटर की कल्पना क्यों करेंगे?


मेरा प्रश्न स्वयं कार्यों के बजाय कार्यों के पीछे तर्क के बारे में है, मैं समझता हूं कि यह प्रोसेसर द्वारा व्याख्या की गई है, मैं उत्सुक हूं कि कैसे। विशेष रूप से इसके पीछे सिद्धांत और इसे छद्म कोड में कैसे दोहराया जा सकता है।
कोर्विन सोंटो

1
मेरे दिमाग में जो गुणा-भाग है, वह स्मृति है। साथ ही लंबे गुणा को उस तरीके से पुनरावृत्ति की आवश्यकता होती है जो मैंने किया था। मैं आगे जाऊंगा और लंबे गुणन के लिए एक फंक्शन को एक साथ फेंक
दूंगा

2
@ कोर्विन, मैंने जिस पुस्तक की सिफारिश की है वह आपकी अच्छी तरह से सेवा करेगी यदि यह आपकी रुचि है। मैं हेरोल्ड एबेल्सन और गेराल्ड जे सुस्मैन द्वारा "कंप्यूटर प्रोग्राम की संरचना और व्याख्या" की भी सिफारिश करता हूं। यह इन सवालों से गहराई से निपटता है।
जोनाथन हेंसन

कई शुरुआती कंप्यूटरों ने केवल जोड़ और घटाव का समर्थन किया। कुछ ने केवल घटाव का समर्थन किया! तो ऑपरेशन x = y * z को do (z गुना) {x + y} के रूप में लागू किया गया था, उसी तरह डिवीजन x = y / z को लागू किया गया था जबकि (y> z) {x + 1; y = y - z}
जेम्स एंडरसन

@ नाम: क्या उन्होंने पारी का समर्थन किया? मुझे उम्मीद है कि गुणन शिफ्ट और ऐड के माध्यम से किया जाएगा, जबकि विभाजन शिफ्ट, तुलना, घटाना था।
केविन क्लाइन

4

इसका मतलब किसी भी तरह से पूरी तरह से जवाब नहीं है, लेकिन यह आपको कुछ विचार देना चाहिए कि चीजों को कैसे लागू किया जाता है। जैसा कि आप शायद जानते हैं कि बाइनरी में संख्याओं का प्रतिनिधित्व किया जाता है। उदाहरण के लिए, एक कंप्यूटर 00000101 के रूप में संख्या 5 का प्रतिनिधित्व कर सकता है। एक बहुत ही बुनियादी ऑपरेशन जो कंप्यूटर कर सकता है वह बाईं ओर है, जो 00001010 देगा जो दशमलव 10 है। यदि यह दो बार सही ढंग से शिफ्टर होता है तो यह 00010100 (दशमलव 20) होगा। हर बार जब हम अंकों को शिफ्ट करते हैं तो 1 बार हम संख्या को दोगुना करते हैं। मान लें कि मेरे पास एक संख्या x थी और मैं इसे 17 से गुणा करना चाहता था। मैं x को 4 बार बाईं ओर शिफ्ट कर सकता था और फिर परिणाम में x (16x + x = 17x) जोड़ सकता था। यह एक संख्या को 17 से गुणा करने का एक प्रभावी तरीका होगा। इससे आपको कुछ जानकारी मिल जाएगी कि कैसे एक कंप्यूटर केवल बार-बार जोड़ के बिना बड़ी संख्या को गुणा कर सकता है।

डिवीजन इसके अलावा, घटाव, शिफ्ट राईट, शिफ्ट लेफ्ट, आदि के संयोजनों का उपयोग कर सकता है।


बस स्पष्ट होने के लिए, आप आम तौर पर एक समय में एक से अधिक बिट द्वारा स्थानांतरित कर सकते हैं। तो उन 4 पारी आपरेशन वास्तव में सिर्फ एक ऑपरेशन हैं, जैसे shl r0, 4:।
कालेब

4

जब मैं एक बच्चा था, तो मैंने सीखा कि कैसे कई परिवर्धन के साथ समय बर्बाद किए बिना, एक पेन और एक पेपर के साथ गुणा और भाग करना है। बाद में मुझे पता चला कि वर्गमूल इस तरह से भी गणना योग्य हैं।

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

इससे पहले, मेरे पिता ने मुझे एक पुस्तक दी थी जहाँ उन जटिल परिचालनों को पहले से ही सैकड़ों मूल्यों के लिए गणना की गई थी और तालिकाओं में प्रस्तुत किया गया था। त्रुटि का अनुमान लगाने के लिए कुछ स्पष्टीकरण भी थे जब आप दो गणना मूल्यों के बीच एक मूल्य की साइन चाहते थे।

पूर्णांक इकाइयाँ, फ़्लोटिंग पॉइंट इकाइयाँ, जीपीयू और डीएसपी सिर्फ सिलिकॉन पर उन सभी पुरानी तकनीकों को लागू करते हैं।


3

मैं आपको यह बताने का प्रयास करूंगा कि डिजिटल प्रोसेसिंग समस्याओं को हल करने के लिए डिजिटल सर्किट कैसे डिज़ाइन किए जाते हैं, जो आपके द्वारा बताई गई समस्याओं का उपयोग करके करते हैं: सीपीयू कैसे परिवर्धन और गुणा लागू करते हैं।

सबसे पहले, सीधे सवाल को रास्ते से हटाने की अनुमति देता है: कैसे एक प्रोग्रामिंग भाषा कुशलता से गुणन और परिवर्धन का मूल्यांकन करती है। उत्तर सरल है, वे उन्हें गुणा में निर्देश देते हैं और निर्देश जोड़ते हैं। उदाहरण के लिए, निम्न कोड:

a = 1 + 1;
b = a * 20;

बस कुछ इस तरह संकलित है:

ADD 1 1  a
MUL a 20 b

(ध्यान दें, कि उपरोक्त विधानसभा एक काल्पनिक सीपीयू के लिए है जो मौजूद नहीं है, सरलता के लिए)।

इस बिंदु पर आपको पता चलता है कि उपरोक्त उत्तर बस समस्या को स्थानांतरित करता है और इसे हार्डवेयर जादू द्वारा हल करता है। अनुवर्ती प्रश्न स्पष्ट रूप से है कि हार्डवेयर जादू कैसे काम करता है?

पहले सरल समस्या को देखें: इसके अलावा।

पहले हम एक परिचित समस्या करते हैं, नियमित आधार 10 संख्याओं में जोड़ते हैं:

 17
+28

पहला कदम 7 और 8 जोड़ना होगा। लेकिन 15 में यह परिणाम एक एकल अंक से अधिक है। तो हम ले 1:

(1)
 17
+28
= 5

अब हम 1, 1 और 2 को एक साथ जोड़ते हैं:

 17
+28
=45

तो इससे हमें निम्नलिखित नियम मिलते हैं:

  1. जब जोड़ का परिणाम एक से अधिक अंक होता है, तो हम कम से कम महत्वपूर्ण अंक रखते हैं और सबसे महत्वपूर्ण अंक को आगे ले जाते हैं

  2. यदि हमारे पास हमारे कॉलम में एक अंक है, तो हम इसे उन संख्याओं के साथ जोड़ते हैं, जिन्हें हम जोड़ रहे हैं

अब यह आधार 2 में नियमों की व्याख्या करने का समय है - बूलियन बीजगणित।

तो बूलियन बीजगणित में, 0 और 1 को एक साथ जोड़ना = 1. 0 और 0 = 0. जोड़ना और 1 और 1 = 10 को जोड़ना जो एक से अधिक अंक हैं इसलिए हम 1 को आगे ले जाते हैं।

इससे हम एक सत्य तालिका बना सकते हैं:

a b  |  sum  carry
-------------------
0 0  |   0     0
0 1  |   1     0
1 0  |   1     0
1 1  |   0     1

इससे हम दो सर्किट / बुलियन समीकरण बना सकते हैं - एक सम के आउटपुट के लिए और दूसरा कैरी के आउटपुट के लिए। सबसे भोला तरीका केवल सभी जानकारी को सूचीबद्ध करना है। कोई भी सत्य तालिका, चाहे वह इस रूप में कितनी भी बड़ी और जटिल क्यों न हो:

(AND inputs in first row) OR (AND of inputs in second row) OR ...

यह मूल रूप से उत्पादों का योग है। हम केवल 1 में परिणाम वाले आउटपुट को देखते हैं और 0s को अनदेखा करते हैं:

sum = (NOT a AND b) OR (a AND NOT b)

चलो प्रोग्रामिंग भाषा के प्रतीकों के साथ AND या NOT की जगह लें, ताकि पढ़ने में आसानी हो:

sum = (!a & b) | (a & !b)

असल में, हमने तालिका को इस तरह परिवर्तित कर दिया है:

a b  |  sum  equation
-------------------
0 0  |   0   
0 1  |   1   (!a & b)
1 0  |   1   (a & !b)
1 1  |   0   

इसे सीधे सर्किट के रूप में लागू किया जा सकता है:

                _____
 a ------------|     |
    \          | AND |-.     ____
     \  ,-NOT--|_____|  \   |    |
      \/                 `--| OR |----- sum
      /\        _____    ,--|____|
     /  `-NOT--|     |  /
    /          | AND |-`
 b ------------|_____|

पर्यवेक्षक पाठकों को इस बिंदु पर ध्यान देना चाहिए कि उपरोक्त तर्क वास्तव में एक ही द्वार के रूप में लागू किया जा सकता है - एक XOR गेट जो सुविधाजनक रूप से हमारे सत्य तालिका द्वारा आवश्यक व्यवहार करता है:

                _____
 a ------------|     |
               | XOR |---- sum
 b ------------|_____|

लेकिन अगर आपका हार्डवेयर आपको XOR गेट प्रदान नहीं करता है, तो ऊपर दिए गए चरण हैं कि आप इसे AND, OR और NOT gates के संदर्भ में कैसे परिभाषित और कार्यान्वित करेंगे।

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

अब हम कैरी सिग्नल के लिए भी ऐसा ही करते हैं। चूँकि केवल एक ही स्थिति है जहाँ कैरी सिग्नल सही है, समीकरण बस है:

carry = a & b

तो कैरी सरल है:

                _____
 a ------------|     |
               | AND |---- carry
 b ------------|_____|

उन्हें एक साथ मिलाकर हम आधे योजक के रूप में जाने जाते हैं:

                _____
 a ------;-----|     |
         |     | XOR |---- sum
 b --;---|-----|_____|
     |   |      _____
     |   '-----|     |
     |         | AND |---- carry
     '---------|_____|

जिस तरह से उपरोक्त सर्किट के लिए समीकरण इस तरह दिखता है:

sum = a ^ b
carry = a & b

आधा योजक कुछ याद कर रहा है। हमने पहला नियम लागू किया है - यदि परिणाम आगे ले जाने की तुलना में एक अंक से अधिक है, लेकिन हमने दूसरा नियम लागू नहीं किया है - यदि कोई कैरी है तो इसे संख्याओं के साथ जोड़ दें।

तो एक पूर्ण योजक को लागू करने के लिए, एक जोड़ने वाला सर्किट जो संख्याओं को जोड़ सकता है जो एक से अधिक अंक हैं, हमें एक सत्य तालिका को परिभाषित करने की आवश्यकता है:

a b c  |  sum  carry
---------------------
0 0 0  |   0     0
0 0 1  |   1     0
0 1 0  |   1     0
0 1 1  |   0     1
1 0 0  |   1     0
1 0 1  |   0     1
1 1 0  |   0     1
1 1 1  |   1     1

राशि के लिए समीकरण अब है:

sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)

हम उसी प्रक्रिया से गुज़र सकते हैं, जो समीकरण को सरल और समीकरण को आसान बना सकती है और इसे सर्किट आदि के रूप में व्याख्या कर सकता है जैसा कि हमने ऊपर किया है, लेकिन मुझे लगता है कि यह उत्तर बहुत लंबा हो रहा है।

अब तक आपको इस बात का अंदाजा हो जाना चाहिए कि डिजिटल लॉजिक कैसे तैयार किया जाता है। ऐसी अन्य चालें हैं जिनका मैंने उल्लेख नहीं किया है जैसे कि करनूघ के नक्शे (सत्य तालिकाओं को सरल बनाने के लिए उपयोग किए गए) और एस्प्रेसो जैसे तर्क संकलक (ताकि आपको हाथ से बूलियन समीकरणों को कारक न करना पड़े) लेकिन मूल रूप से मूल रूप से मैं क्या कर रहा हूं ऊपर रेखांकित किया हुआ:

  1. समस्या को तब तक निपटाएँ जब तक आप एकल बिट (अंक) के स्तर पर काम न कर सकें।

  2. सत्य तालिका का उपयोग करके इच्छित आउटपुट को परिभाषित करें।

  3. तालिका को बूलियन समीकरण में परिवर्तित करें और समीकरण को सरल बनाएं।

  4. समीकरण को तर्क गेट्स के रूप में व्याख्या करें।

  5. लॉजिक गेट को लागू करके अपने लॉजिक सर्किट को वास्तविक हार्डवेयर सर्किट में बदलें।

यह कैसे मौलिक (या बल्कि, निम्न-स्तर) समस्याओं को वास्तव में हल किया जाता है - बहुत सारे और बहुत सारे सत्य टेबल। असली रचनात्मक कार्य एक जटिल कार्य को तोड़ने में है जैसे कि एमपी 3 डिकोडिंग से बिट स्तर तक ताकि आप इस पर सत्य तालिकाओं के साथ काम कर सकें।

क्षमा करें, मेरे पास यह समझाने का समय नहीं है कि गुणन को कैसे लागू किया जाए। आप इस पर एक दरार लेने की कोशिश कर सकते हैं कि कितने गुणा काम करता है के नियमों का पता लगाकर इसे द्विआधारी में व्याख्या करना और फिर इसे सत्य तालिकाओं तक तोड़ने का प्रयास करें। या आप विकिपीडिया: http://en.wikipedia.org/wiki/Binary_multiplier पढ़ सकते हैं


2

बुनियादी अंकगणितीय निर्देश विधानसभा निर्देशों के साथ किए जाते हैं जो अत्यधिक कुशल होते हैं।

अधिक जटिल (या अमूर्त) निर्देश या तो विधानसभा में लूपिंग तंत्र के साथ किए जाते हैं या एसटीडी लिबास में संभाले जाते हैं।

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

चार्ल्स पेट्ज़ोल्ड द्वारा इस विषय का एक बड़ा परिचय "कोड" है।


1
या लुकिंग टेबल। बहुत जल्दी मूल्यों को बढ़ाने और उन्हें देखने के लिए। उदाहरण पाप / कोस / टैन (पूर्णांक विभाजन हालांकि यह पूर्व-संगणित और हार्डवेयर में संग्रहीत है)।
मार्टिन यॉर्क

1

फंडामेंटल ऑफ डिजिटल लॉजिक जैसी एक पुस्तक प्राप्त करें ... , जो मुझे लगता है कि फ्रेशमैन / सोफोमोर ईई छात्रों के लिए अभी भी बहुत मानक है, और इसके माध्यम से अपना काम करें (एड: यह एक छोटे से भाग्य का खर्च करता है, इसलिए उपयोग किए गए या पूर्व संस्करण के लिए देखें यह)। यह आपको योजक और गुणक के माध्यम से ऊपर ले जाएगा, और आपको एक पृष्ठभूमि प्रदान करेगा जो हार्डवेयर क्या कर रहा है इसके पीछे के कुछ सिद्धांतों को समझना शुरू कर देगा।

आपका उत्तर, अल्पावधि में, "बन जाएगा" क्योंकि यह जटिल व्यवहार को उकसाने के लिए सरल तर्क के कई टुकड़ों के साथ "फिट बैठता है" के बजाय "क्योंकि यह करता है।"

यदि आप सभी सिद्धांतों को समझने की कोशिश करना चाहते हैं कि कैसे कार्यक्रमों को संकलित किया जाता है और चलाया जाता है, तो इसके लिए संयोजन के रूप में जाएं, ताकि आप अंततः देख सकें कि कैसे सब कुछ बीच में मिलता है।


1

यहाँ बहुत सारे अच्छे उत्तर हैं। आपने सही विचार के साथ भी शुरुआत की: जटिल ऑपरेशन जैसे जटिल कार्य सरल ऑपरेशन से निर्मित होते हैं। जैसा कि आपने अनुमान लगाया, परिवर्धन श्रृंखलाओं का उपयोग करने की तुलना में गुणा निर्देश के बिना गुणा करने के तेज़ तरीके हैं। किसी भी गुणा को छोटे गुणा के योग के रूप में, या बदलाव और परिवर्धन के संयोजन के रूप में लागू किया जा सकता है। उदाहरण:

a = 5 + 5 + 5 + 5 + 5;           // 5*5, but takes 5 operations
b = (5 << 2) + 5;                // 5*5 in only 2 operations
c = (41 << 4) + (41 << 2) + 41   // 41*21 in 4 operations

इसी तरह छोटे ऑपरेशन में विभाजन को तोड़ा जा सकता है। XOR (^) प्रत्येक प्रोसेसर पर एक अंतर्निहित अनुदेश है जिसे मैंने कभी देखा है, लेकिन यहां तक ​​कि इसे AND, OR, और NOT के संयोजन के रूप में लागू किया जा सकता है।

हालांकि, मुझे लगता है कि विशिष्ट उत्तर आपके द्वारा दिए गए निर्देशों के प्रकार के सामान्य विचार की तुलना में आपके लिए कम संतोषजनक होंगे और उन निर्देशों को अधिक जटिल कार्यों में कैसे जोड़ा जा सकता है। विधानसभा भाषा की स्वस्थ खुराक की तुलना में उस तरह की जिज्ञासा के लिए बेहतर कुछ नहीं है। यहां MIPS असेंबली लैंग्वेज का बहुत ही अप्रचलित परिचय है।


1

यहां बताया गया है कि एक आधुनिक प्रोसेसर दो 64 बिट पूर्णांकों के गुणन को कैसे कार्यान्वित कर सकता है:

आप जानते हैं कि लंबे हाथ का गुणा कैसे करना है। दो 10 अंकों की संख्याओं को गुणा करने के लिए, आप एक 10 अंकों की संख्या को दूसरे संख्या के 10 अंकों से गुणा करेंगे, 11 अंकों के परिणाम को एक के बाद एक और नीचे शिफ्ट करें, फिर सभी संख्याओं को जोड़ें।

एक आधुनिक प्रोसेसर 64 सभी 64 बिट्स के साथ ऐसा करता है। हालांकि, दो एकल बिट संख्याओं का गुणन बहुत सरल है: 1 x 1 = 1, अन्य सभी उत्पाद शून्य हैं। यह एक तार्किक और के साथ लागू किया जाता है। और दशमलव उत्पाद के विपरीत, जहां परिणाम दो अंक हो सकता है, एकल बिट संख्याओं का एक द्विआधारी उत्पाद हमेशा एक बिट होता है।

तो अब आपके पास 64 बिट्स की 64 पंक्तियाँ हैं जिन्हें जोड़ने की आवश्यकता है। लेकिन 64 बिट संख्या के 64 जोड़ स्लोवू हैं। तो प्रोसेसर 3/2 योजक या 7/3 योजक का उपयोग करता है: यदि आप 3 एकल बिट संख्या जोड़ते हैं, तो परिणाम 0, 1, 2 या 3 हो सकता है, जो दो बिट्स में फिट होता है। यदि आप 7 एकल बिट संख्या जोड़ते हैं, तो परिणाम 0 से 7 तक की संख्या है, जिसे 3 बिट्स द्वारा दर्शाया जा सकता है। आईबीएम का दावा है कि वे सिर्फ 18 आदिम सर्किट (पावरपीसी प्रलेखन) के साथ 7/3 योजक बना सकते हैं, मुझे यकीन है कि इंटेल और एआरएम भी ऐसा कर सकते हैं।

आपके पास 4096 बिट्स हैं, उन्हें 7 बिट्स के लगभग 600 समूहों में एक ही बिट पोज़िशन में समूहित करें, और 4096 बिट्स को 2,000 से कम करने के लिए परिणाम को कम करने के लिए लगभग 600 7/3 योजक का उपयोग करें। फिर आप फिर से वही करते हैं, और फिर से, जब तक आप बिट्स के जोड़े के साथ समाप्त नहीं होते हैं जिन्हें एक साधारण पूर्ण योजक में खिलाया जा सकता है।

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