माइक्रोसॉफ्ट बाइनरी फॉर्मेट

कम्प्यूटिंग में, माइक्रोसॉफ्ट बाइनरी फॉर्मेट (एमबीएफ) फ़्लोटिंग पॉइंट नंबरों के लिए प्रारूप है जिसका उपयोग वर्जन 4.00 से पहले एमबीएएसआईसी, जीडब्ल्यू-बेसिक और क्विकबेसिक सहित माइक्रोसॉफ्ट की बेसिक भाषाओं में किया जाता था।

प्रारूप के दो मुख्य वर्जन हैं. मूल वर्जन को मेमोरी-बाधित सिस्टम और 32 बिट्स (4 बाइट्स) में संग्रहीत संख्याओं के लिए डिज़ाइन किया गया था, जिसमें 23-बिट सिग्नेचर, 1-बिट साइन और 8-बिट प्रतिपादक था। माइक्रोसॉफ्ट बेसिक या एक्सटेंडेड बेसिक-80 या एक्सटेंडेड (12के) बेसिक में 64 बिट्स के साथ डबल-प्रिसिजन प्रकार सम्मिलित है।

उस अवधि के समय जब इसे इंटेल 8080 प्लेटफ़ॉर्म से एमओएस 6502 प्रोसेसर में पोर्ट किया जा रहा था इस प्रकार प्रोसेसर कम्प्यूटर मानक सुविधा के रूप में अधिक मेमोरी के साथ शिप करना प्रारंभ कर रहे थे। यह वर्जन मूल 32-बिट प्रारूप या वैकल्पिक विस्तारित 40-बिट (5-बाइट) प्रारूप के साथ प्रस्तुत किया गया था। 40-बिट प्रारूप का उपयोग 1970 और 1980 के दशक के अधिकांश पोर्टेबल कंप्यूटरों द्वारा किया जाता था। इन दो वर्जनों को कभी-कभी क्रमशः 6-अंकीय और 9-अंकीय के रूप में जाना जाता है।

x86 प्रोसेसर वाले पीसी पर, क्विकबेसिक ने, वर्जन 4 से पहले, 64-बिट (8-बाइट) प्रारूप में 55-बिट मंटिसा का उपयोग करके डबल-प्रिसिजन प्रारूप को फिर से प्रस्तुत किया था। इस प्रकार क्विकबेसिक 4 में स्पेसांतरण के समय एमबीएफ को छोड़ दिया गया था, जो कुछ साल पहले प्रस्तुत किए गए मानक IEEE 754 प्रारूप का उपयोग करता था।

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

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

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

अल्टेयर बेसिक की प्रारंभ हुई और जल्द ही अधिकांश प्रारंभी पोर्टेबल कंप्यूटरों में माइक्रोसॉफ्ट बेसिक का कोई न कोई रूप चलने लगा था। एमओएस टेक्नोलॉजी 6502 सीपीयू के लिए बेसिक पोर्ट, जैसे कि कमोडोर पीईटी में उपयोग किया जाता है, जिसने 6502 के कम कोड घनत्व के कारण अधिक स्पेस ले लीया था। इस कारण से यह संभवतः मशीन-विशिष्ट इनपुट और आउटपुट कोड के साथ एकल ROM चिप में फिट नहीं होता है। चूँकि अतिरिक्त चिप आवश्यक थी, अतिरिक्त स्पेस उपलब्ध था, और इस प्रकार इसका उपयोग फ्लोटिंग-पॉइंट प्रारूप को 32 से 40 बिट्स तक बढ़ाने के लिए किया गया था। यह विस्तारित प्रारूप न केवल कमोडोर बेसिक 1 और 2 द्वारा प्रदान किया गया था, किन्तु वर्जन 1.1 (1977) से एप्पलसॉफ्ट बेसिक I और II, वर्जन 1.1ए (1977) से केआईएम-1 बेसिक और वर्जन 2बी (1980) से टेंजेरीन माइक्रोटैन 65 बेसिक द्वारा भी समर्थित था। कुछ ही समय बाद, ज़िलॉग Z80 पोर्ट, जैसे कि TRS-80 (1978) के लिए TRS-80 लेवल II बेसिक, ने 64-बिट, डबल-प्रिसिजन फॉर्मेट को 32-बिट, सिंगल-प्रिसिजन से अलग डेटा प्रकार के रूप में प्रस्तुत किया था।  इस प्रकार माइक्रोसॉफ्ट ने फोरट्रान के कार्यान्वयन में समान फ़्लोटिंग-पॉइंट प्रारूपों का उपयोग किया था और उनके मैक्रो असेंबलर एमएएसएम के लिए, चूँकि उनकी स्प्रेडशीट मल्टीप्लान है  और उनके कोबोल कार्यान्वयन में बाइनरी-कोडित दशमलव (बीसीडी) फ़्लोटिंग पॉइंट का उपयोग किया गया था। फिर भी, कुछ समय के लिए एमबीएफ पोर्टेबल कंप्यूटरों पर वास्तविक फ़्लोटिंग-पॉइंट प्रारूप बन गया, इस सीमा तक कि लोग अभी भी कभी-कभी इसका उपयोग करते हुए विरासत फ़ाइलों और फ़ाइल स्वरूपों का सामना करते हैं।

एक समानांतर विकास में, इंटेल ने 1976 में फ्लोटिंग-पॉइंट सह प्रोसेसर का विकास प्रारंभ किया था। इंटेल के सलाहकार के रूप में विलियम मोर्टों कहाँ ने सुझाव दिया कि इंटेल डिजिटल इक्विपमेंट कॉर्पोरेशन (DEC) VAX के फ्लोटिंग पॉइंट का उपयोग करे। पहला VAX, VAX-11/780 1977 के अंत में सामने आया था, और इसके फ्लोटिंग पॉइंट को अत्यधिक महत्व दिया गया था। VAX का फ़्लोटिंग-पॉइंट प्रारूप एमबीएफ से केवल इस मायने में भिन्न था कि इसमें सबसे महत्वपूर्ण बिट में साइन था। चूँकि, अपनी चिप को यथासंभव व्यापक मार्केट में बेचने के लिए, काहन को विशिष्टताओं को तैयार करने के लिए कहा गया था। जब इंटेल की नई चिप की अफवाहें उसके प्रतिस्पर्धियों तक पहुंचीं थी, जिससे उन्होंने इंटेल को बहुत अधिक बढ़त प्राप्त करने से रोकने के लिए आईईईई 754-1985 नामक मानकीकरण प्रयास प्रारंभ किया था। चूंकि 8-बिट प्रतिपादक दोहरे-परिशुद्धता संख्याओं के लिए वांछित कुछ परिचालनों के लिए पर्याप्त चौड़ा नहीं था, उदाहरण के लिए दो 32-बिट संख्याओं के उत्पाद को संग्रहीत करने के लिए, इंटेल के प्रस्ताव और डीईसी के प्रति-प्रस्ताव में 11 बिट्स का उपयोग किया गया था, जैसे 1965 से सीडीसी 6600 का समय-परीक्षणित सीडीसी 6600 या 60-बिट फ़्लोटिंग पॉइंट या 60-बिट फ़्लोटिंग-पॉइंट प्रारूप   कहन के प्रस्ताव में अनन्तताओं का भी प्रावधान किया गया है, जो विभाजन-दर-शून्य स्थितियों से निपटने में उपयोगी होते हैं; नॉट-ए-नंबर मान, जो अमान्य संचालन से निपटने में उपयोगी होते हैं; इस प्रकार असामान्य संख्याएँ, जो अंडरफ्लो के कारण होने वाली समस्याओं को कम करने में सहायता करती हैं;   और उत्तम संतुलित प्रतिपादक पूर्वाग्रह, जो किसी संख्या का व्युत्क्रम लेते समय अतिप्रवाह और अल्पप्रवाह से बचने में सहायता कर सकता है।

जब तक क्विकबेसिक 4.00 जारी किया गया था, इस प्रकार IEEE 754 मानक व्यापक रूप से अपनाया गया था उदाहरण के लिए, इसे इंटेल के इंटेल 387 सहप्रोसेसर और इंटेल 80486 से प्रत्येक x86 प्रोसेसर में सम्मिलित किया गया था। क्विकबेसिक वर्जन 4.0 और 4.5 डिफ़ॉल्ट रूप से IEEE 754 फ़्लोटिंग-पॉइंट वेरिएबल का उपयोग करते हैं, किन्तु (कम से कम वर्जन 4.5 में) कमांड-लाइन विकल्प है इस प्रकार /MBF आईडीई और कंपाइलर के लिए जो आईईईई से एमबीएफ फ्लोटिंग-पॉइंट नंबरों पर स्विच करता है, इस प्रकार पहले से लिखे गए प्रोग्रामों का समर्थन करने के लिए जो एमबीएफ डेटा प्रारूपों के विवरण पर विश्वास करते हैं। विज़ुअल बेसिक (क्लासिक) भी एमबीएफ के अतिरिक्त आईईईई 754 प्रारूप का उपयोग करता है।

तकनीकी विवरण
एमबीएफ संख्याओं में 8- बिट्स बेस-2 एक्सपोनेंट, साइन बिट (पॉजिटिव मंटिसा: s = 0; नेगेटिव मंटिसा: s = 1) और 23- सम्मिलित होता है। 31- या 55-बिट महत्व का मंटिसा स्पष्ट मंटिसा के बाईं ओर सदैव 1-बिट निहित होता है, और रेडिक्स बिंदु इस कल्पित बिट से पहले स्थित होता है. प्रतिपादक को प्रतिपादक पूर्वाग्रह के साथ एन्कोड किया गया है, जिससे प्रतिपादक  को x = द्वारा दर्शाया गया है , प्रतिपादक  को x = द्वारा दर्शाया गया है , x = 0 (00h) के लिए विशेष स्थिति में, पूर्ण संख्या शून्य होने का प्रतिनिधित्व करती है।

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

एमबीएफ एकल-परिशुद्धता प्रारूप (32 बिट्स, 6-अंकीय बेसिक): एमबीएफ विस्तारित-परिशुद्धता प्रारूप (40 बिट्स, 9-डिजिट बेसिक ): एमबीएफ डबल-प्रिसिजन प्रारूप (64 बिट्स):

उदाहरण

 * "10":
 * 32-bit format: 84h, 20h, 00h, 00h
 * 40-bit format: 84h, 20h, 00h, 00h, 00h
 * "2":
 * 32-bit format: 82h, 00h, 00h, 00h
 * 40-bit format: 82h, 00h, 00h, 00h, 00h
 * "1":
 * 32-bit format: 81h, 00h, 00h, 00h
 * 40-bit format: 81h, 00h, 00h, 00h, 00h
 * "0":
 * 32-bit format: 00h, 00h, 00h, 00h (or 00h, xxh, xxh, xxh)
 * 40-bit format: 00h, 00h, 00h, 00h, 00h (or 00h, xxh, xxh, xxh, xxh)
 * "0.5"::
 * 32-bit format: 80h, 00h, 00h, 00h
 * 40-bit format: 80h, 00h, 00h, 00h, 00h
 * "0.25":
 * 32-bit format: 7Fh, 00h, 00h, 00h
 * 40-bit format: 7Fh, 00h, 00h, 00h, 00h
 * "-0.5":
 * 32-bit format: 80h, 80h, 00h, 00h
 * 40-bit format: 80h, 80h, 00h, 00h, 00h
 * "sqrt(0.5)":
 * 32-bit format: 80h, 35h, 04h, F3h
 * 40-bit format: 80h, 35h, 04h, F3h, 34h
 * "sqrt(2)":
 * 32-bit format: 81h, 35h, 04h, F3h
 * 40-bit format: 81h, 35h, 04h, F3h, 34h
 * "ln(2)":
 * 32-bit format: 80h, 31h, 72h, 18h
 * 40-bit format: 80h, 31h, 72h, 17h, F8h
 * "log2(e)":
 * 32-bit format: 81h, 38h, AAh, 3Bh
 * 40-bit format: 81h, 38h, AAh, 3Bh, 29h
 * "pi/2":
 * 32-bit format: 81h, 49h, 0Fh, DBh
 * 40-bit format: 81h, 49h, 0Fh, DAh, A2h
 * "2*pi":
 * 32-bit format: 83h, 49h, 0Fh, DBh
 * 40-bit format: 83h, 49h, 0Fh, DAh, A2h

यह भी देखें

 * फ़्लोटिंग-पॉइंट अंकगणित
 * आईईईई 754 - फ़्लोटिंग-पॉइंट अंकगणित के लिए मानक
 * आईबीएम हेक्साडेसिमल फ़्लोटिंग-पॉइंट

==संदर्भ                                                                                                                                                                                                            ==

==बाहरी संबंध                                                                                                                                                                                                                 ==
 * Microsoft provides a dynamic link library for 16-bit Visual Basic containing functions to convert between एमबीएफ data and IEEE 754.
 * This library wraps the एमबीएफ conversion functions in the 16-bit Visual C(++) CRT.
 * These conversion functions will round an IEEE double-precision number like ¾ ⋅ 2−128 to zero rather than to 2−128.
 * They don't support denormals at all: the IEEE or एमबीएफ single-precision number 2−128 will be converted to zero, even though it is representable in either format.
 * This library is only intended for use with Visual Basic; C(++) programs are expected to call the CRT functions directly.