दशमलव अंकगणित ने VisiCalc को धीमा क्यों किया?
VisiCalc के बारे में एक उत्कृष्ट लेख है जो सभी विवरणों में जाता है कि क्या हुआ और क्यों, अत्यधिक अनुशंसित है यदि आप कंप्यूटिंग इतिहास के उस हिस्से में रुचि रखते हैं। मैं इस खंड को पढ़ रहा था:
इसके दिल में, VisiCalc संख्याओं के बारे में है। हमारे द्वारा किए गए प्रारंभिक निर्णयों में से एक दशमलव अंकगणित का उपयोग करना था ताकि त्रुटियां वही होंगी जो एक लेखाकार दशमलव कैलकुलेटर का उपयोग करके देखेगा। पूर्वव्यापीकरण में यह एक बुरा निर्णय था क्योंकि लोग ध्यान नहीं देते हैं और इसने गणना को बहुत धीमा कर दिया है क्योंकि वे द्विआधारी में होंगे।
और सिर हिलाते हुए, हाँ, इस संबंध में विस्काल के उत्तराधिकारी पीछे हट गए; आज तक, इंटरनेट ऐसे सवालों और जवाबों से भरा है कि क्यों एक्सेल 0.1 और बाइनरी फ्लोटिंग पॉइंट जैसी विसंगतियों के साथ विसंगतियों को प्रदर्शित करता है, जिससे लोगों को उम्मीद नहीं होती है। VisiCalc को वास्तव में उस समय एक विज्ञापन अभियान शुरू करना चाहिए, जो इस ओर इशारा करता है ...
... एक मिनट रुकिए। फ्रिज का तर्क।
गणना बहुत धीमी कर दी?
VisiCalc 6502 पर लिखा गया था, जो BCD अंकगणित का समर्थन करता है। आपको बस दशमलव मोड को चालू करना होगा, और सीपीयू बीसीडी बाइट्स को उसी गति से जोड़ देगा, जैसे कि यह बाइनरी बाइट्स जोड़ देगा।
दशमलव में व्यक्त होने पर एक स्प्रेडशीट में अधिकांश संख्याएं सरल होती हैं। 1234.56 जैसी संख्या बीसीडी में तीन बाइट्स लेती है जहां इसे डबल प्रिसिजन बाइनरी फ्लोटिंग पॉइंट में आठ बाइट्स लेने होंगे। यह न केवल मेमोरी को बचाता है बल्कि, यदि आपकी गणना रूटीन (जो कि सॉफ्टवेयर में की जानी है - मशीन में कोई एफपीयू नहीं थी) जल्दी बाहर निकलने का अवसर लेती है, समय भी बचाती है। तो आमतौर पर स्प्रेडशीट में होने वाली संख्याओं की गणना दशमलव में तेज होनी चाहिए ।
और छोटे स्प्रैडशीट अपना बहुत समय प्रदर्शन को अपडेट करने में लगाते हैं। आंतरिक प्रतिनिधित्व दशमलव के अनुसार ASCII में आंतरिक प्रतिनिधित्व से संख्या को परिवर्तित करना काफी तेज है।
तो उन्होंने कहा कि दशमलव ने गणनाओं को धीमा क्यों किया?
जवाब
1234.56 जैसी संख्या बीसीडी में तीन बाइट्स लेती है जहां इसे डबल प्रिसिजन बाइनरी फ्लोटिंग पॉइंट में आठ बाइट्स लेने होंगे।
सामान्यतया, ऐसा नहीं है। यदि आपके पास डेटाबेस अंकों की परिभाषा 6 अंकों की कुल है, 4 दशमलव से पहले, 2 बाद, केवल सकारात्मक संख्या है, तो हाँ आप 3 8-बिट बीसीडी बाइट्स में 1234.56 का प्रतिनिधित्व कर सकते हैं। लेकिन अगर, जैसा कि आमतौर पर अधिक होता है:
- आप किसी भी संख्या को कई और अंक देने की अनुमति देते हैं - उदाहरण के लिए, 8 अंक एक न्यूनतम है जो केवल (लेकिन शामिल नहीं) $ 1,000,000 के लिए अनुमति देता है। अधिक विशिष्ट 10 या 12 या अधिक होगा।
- आप अलग-अलग क्षेत्रों में दशमलव स्थान पर अंकों की संख्या को अलग-अलग करने की अनुमति देते हैं - जैसे, यूएस के लिए 2 (और कई अन्य) मुद्रा मूल्य, लेकिन यूनिट लागत के लिए 6 या अधिक (उदाहरण के लिए, उपयोगिता बिलों के लिए kWh की लागत)
- आप नकारात्मक संख्या की अनुमति देते हैं।
फिर आप बहुत जल्दी 3 बाइट्स से परे जाते हैं। 8 बाइट्स एक उचित न्यूनतम हो जाता है ।
यहां तक कि भंडारण (गणना की अनदेखी) के लिए, 3 बाइट्स 6-अंकीय संख्या के लिए काम नहीं करते हैं क्योंकि कुछ को कहीं न कहीं यह परिभाषित करना होता है कि इस सेल में 3-बाइट पॉजिटिव संख्या है जो अंतिम 2 अंकों से पहले दशमलव बिंदु के साथ है। यह एक बाइट लेता है, इसलिए अब हम 4 बाइट पर हैं।
इसके अलावा, अतिरिक्त जोड़तोड़ के लिए आवश्यक कोड (कोड / अलग-अलग लंबाई के सांख्यिक स्वरूप को डिकोड करता है) विशिष्ट 8-बिट सिस्टम पर उपलब्ध बहुत सीमित 64k कोड + डेटा में खाता है। यह आसानी से मामला हो सकता है कि स्प्रेडशीट में संख्यात्मक कोशिकाओं के आकार (और उम्मीद से औसतन छोटे) पर भिन्न मूल्यों द्वारा सहेजे गए स्थान को आम तौर पर उन संख्याओं के प्रदर्शन, हेरफेर और गणना का समर्थन करने के लिए मेमोरी में आवश्यक अतिरिक्त कोड द्वारा पल्ला झुकना होगा। ।
6502 समर्थित SIMPLE BCD अंकगणित। मैं शर्त लगा सकता हूं कि विसेकैल लोग अंत में उस सुविधा का उपयोग नहीं करते थे और खरोंच से पूरी बात लिखी थी। वहाँ सिर्फ जोड़ और घटाव नहीं है, वहाँ भी गुणा और भाग है, प्लस विस्काल फ्लिकिंग पॉइंट (बस दशमलव फ़्लोटिंग पॉइंट) था।
दशमलव गणित धीमा होने का कारण बस एक ही कारण है "कोई भी" आज दशमलव गणित का उपयोग नहीं करता है, वे बाइनरी गणित का उपयोग करते हैं। बाइनरी गणित के साथ, प्रत्येक बिट एक अंक है। दशमलव गणित के साथ, 4 बिट एक अंक है। कम परिशुद्धता के लिए अधिक मेमोरी, गणित सिर्फ धीमी है, कंप्यूटर के लिए यह सिर्फ एक बहुत अधिक काम है, यहां तक कि 6502 इसके लिए नवजात समर्थन भी है।
(और, हाँ, विभिन्न स्थानों पर दशमलव गणित का उपयोग सभी जगह किया जाता है, लेकिन यह नियम नहीं है।)
क्योंकि 6502 पर भी दशमलव संचालन धीमा है। 8-बिट बीसीडी जोड़ और घटाव के लिए प्रोसेसर समर्थन है, लेकिन यह है।
दशमलव गुणन, विभाजन, शिफ्टिंग, फ्लोटिंग पॉइंट नॉर्मलाइज़ेशन और शायद तुलना के लिए भी कोड बाइनरी की तुलना में कुछ बड़ा और धीमा होगा।
उदाहरण के लिए, शिफ्ट-और-घटाना डिवीजन रूटीन को मूल्य को आधा करने के लिए एक सबरूटीन की आवश्यकता होती है। बाइनरी में यह तुच्छ है। उदाहरण के रूप में 8 बिट मान का उपयोग करना:
LSR
दशमलव मोड में, यह कुछ इस तरह होगा ( "दशमलव मोड में गुणा और विभाजन" के सौजन्य से ):
ROR
N08 PHP
BPL HALF2
SEC
SBC #$30
HALF2 BIT N08
BEQ HALF3
SEC
SBC #3
HALF3 PLP
इस तरह कोड एक दशमलव विभाजन दिनचर्या के आंतरिक लूप में होगा। गति दंड महत्वपूर्ण है।