Format binarny Microsoftu

W informatyce Microsoft Binary Format ( MBF ) to format liczb zmiennoprzecinkowych , który był używany w językach BASIC firmy Microsoft , w tym MBASIC , GW-BASIC i QuickBASIC przed wersją 4.00.

Istnieją dwie główne wersje formatu. Oryginalna wersja została zaprojektowana dla systemów z ograniczoną pamięcią i przechowywała liczby w 32 bitach (4 bajty), z 23-bitową mantysą , 1-bitowym znakiem i 8-bitowym wykładnikiem . Rozszerzony (12k) BASIC zawierał typ podwójnej precyzji z 64 bitami.

W okresie, gdy był przenoszony z platformy Intel 8080 na procesor MOS 6502 , komputery zaczynały być dostarczane z większą ilością pamięci jako standardową funkcją. Ta wersja była oferowana z oryginalnym formatem 32-bitowym lub opcjonalnym rozszerzonym formatem 40-bitowym (5-bajtowym). Format 40-bitowy był używany przez większość komputerów domowych w latach 70. i 80. XX wieku. Te dwie wersje są czasami nazywane odpowiednio „6-cyfrowymi” i „9-cyfrowymi”.

Na komputerach PC z procesorem x86 QuickBASIC przed wersją 4 ponownie wprowadził format podwójnej precyzji przy użyciu 55-bitowej mantysy w formacie 64-bitowym (8-bajtowym). MBF został porzucony podczas przejścia na QuickBASIC 4, który wykorzystywał standardowy IEEE 754 , wprowadzony kilka lat wcześniej.

Historia

Bill Gates i Paul Allen pracowali nad Altair BASIC w 1975 roku. Opracowywali oprogramowanie na Uniwersytecie Harvarda na DEC PDP-10 z emulatorem Altair . Brakowało im tylko kodu do obsługi liczb zmiennoprzecinkowych, wymaganego do obsługi obliczeń na bardzo dużych i bardzo małych liczbach, co byłoby szczególnie przydatne w nauce i inżynierii. Jednym z proponowanych zastosowań Altaira był kalkulator naukowy.

Panel przedni Altaira 8800

Podczas kolacji w Currier House , studenckim domu mieszkalnym na Harvardzie, Gates i Allen poskarżyli się swoim towarzyszom obiadu, że muszą napisać ten kod, a jeden z nich, Monte Davidoff , powiedział im, że już wcześniej pisał procedury zmiennoprzecinkowe i przekonał Gatesowi i Allenowi, że jest w stanie napisać kod zmiennoprzecinkowy Altair BASIC. W tamtym czasie, gdy IBM wprowadzał własne programy, nie było standardu dla liczb zmiennoprzecinkowych, więc Davidoff musiał wymyślić własny. Zdecydował, że 32 bity zapewnią wystarczający zasięg i precyzję. Kiedy Allen musiał to zademonstrować MITS , po raz pierwszy uruchomiono go na prawdziwym Altairze. Ale zadziałało i kiedy wprowadził „PRINT 2+2”, procedura dodawania Davidoffa dała prawidłową odpowiedź.

Kopia kodu źródłowego Altair BASIC pojawiła się ponownie w 1999 roku. Pod koniec lat 70. były nauczyciel i dziekan Gatesa, Harry Lewis , znalazł ją za meblami w biurze w Aiden i umieścił w szafce na akta. Po dłuższym zapomnieniu o jego istnieniu, Lewis w końcu wpadł na pomysł wyeksponowania wpisu w lobby. Zamiast tego zdecydowano się zachować oryginalną listę i wyprodukować kilka kopii do wystawienia i konserwacji, po tym, jak bibliotekarka i konserwatorka Janice Merrill-Oldham zwrócił uwagę na jego znaczenie. Komentarz w źródle określa Davidoffa jako autora pakietu matematycznego Altair BASIC.

System Radio Shack Tandy TRS-80 Model I

Altair BASIC wystartował i wkrótce większość wczesnych komputerów domowych korzystała z jakiejś formy Microsoft BASIC. Port BASIC dla 6502 , taki jak używany w Commodore PET , zajmował więcej miejsca ze względu na niższą gęstość kodu 6502. Z tego powodu prawdopodobnie nie zmieściłby się w jednym chipie ROM razem z wejściem specyficznym dla maszyny i kod wyjściowy. Ponieważ potrzebny był dodatkowy układ, dostępna była dodatkowa przestrzeń, która została częściowo wykorzystana do rozszerzenia formatu zmiennoprzecinkowego z 32 do 40 bitów. Ten rozszerzony format został dostarczony nie tylko przez Commodore BASIC 1 i 2, ale był również obsługiwany przez Applesoft BASIC I i II od wersji 1.1 (1977), KIM-1 BASIC od wersji 1.1a (1977) i MicroTAN BASIC od wersji 2b (1980). Niedługo potem Z80 , takie jak Level II BASIC dla TRS-80 (1978), wprowadziły 64-bitowy format podwójnej precyzji jako odrębny typ danych od 32-bitowego formatu pojedynczej precyzji. Microsoft używał tych samych formatów zmiennoprzecinkowych w swojej implementacji Fortranu i swojego asemblera makr MASM , chociaż ich arkusz kalkulacyjny Multiplan i ich COBOL implementacja wykorzystywała liczbę zmiennoprzecinkową dziesiętną kodowaną binarnie (BCD). Mimo to przez jakiś czas MBF stał się de facto formatem zmiennoprzecinkowym na komputerach domowych, do tego stopnia, że ​​​​ludzie wciąż czasami napotykają starsze pliki i formaty plików, które go używają.

Minikomputer VAX-11/780

W równoległym rozwoju Intel rozpoczął opracowywanie koprocesora zmiennoprzecinkowego w 1976 roku. William Morton Kahan , jako konsultant Intela, zasugerował, aby Intel użył zmiennoprzecinkowego VAX firmy Digital Equipment Corporation (DEC). Pierwszy VAX, VAX-11/780 pojawił się dopiero pod koniec 1977 roku, a jego zmiennoprzecinkowy był wysoko ceniony. Formaty zmiennoprzecinkowe VAX różniły się od MBF tylko tym, że miały znak w najbardziej znaczącym bicie. Jednak chcąc wprowadzić swój chip na jak najszerszy rynek, Kahan został poproszony o sporządzenie specyfikacji. Kiedy pogłoski o nowym chipie Intela dotarły do ​​jego konkurentów, rozpoczęli oni prace nad standaryzacją, nazwaną IEEE 754 , aby uniemożliwić Intelowi zdobycie zbyt dużej pozycji. Ponieważ 8-bitowy wykładnik nie był wystarczająco szeroki dla niektórych operacji pożądanych dla liczb o podwójnej precyzji, np. do przechowywania iloczynu dwóch liczb 32-bitowych, propozycja Intela i kontrpropozycja DEC wykorzystywały 11 bitów, podobnie jak sprawdzony w czasie 60-bitowy format zmiennoprzecinkowy CDC 6600 z 1965 r. Propozycja Kahana przewidywała również nieskończoności, które są przydatne w przypadku warunków dzielenia przez zero; wartości nieliczbowe, które są przydatne w przypadku niepoprawnych operacji; liczby nienormalne , które pomagają złagodzić problemy spowodowane niedoborem; oraz lepiej zrównoważone odchylenie wykładnicze , które może pomóc uniknąć przepełnienia i niedomiaru podczas obliczania odwrotności liczby.

Do czasu wydania QuickBASIC 4.00 [ kiedy? ] standard IEEE 754 został szeroko przyjęty — na przykład został włączony do koprocesora Intel 387 i każdego procesora x86 począwszy od 486 . QuickBASIC w wersjach 4.0 i 4.5 domyślnie używa zmiennych zmiennoprzecinkowych IEEE 754, ale (przynajmniej w wersji 4.5) dostępna jest opcja wiersza poleceń / MBF dla IDE i kompilatora, który przełącza się z liczb zmiennoprzecinkowych IEEE na MBF, na obsługują wcześniej napisane programy, które opierają się na szczegółach formatów danych MBF. Visual Basic używa również formatu IEEE 754 zamiast MBF.

Szczegóły techniczne

Liczby MBF składają się z 8-bitowego wykładnika o podstawie 2, bitu znaku (mantysa dodatnia: s = 0; mantysa ujemna: s = 1) i 23-, 31- lub 55-bitowej mantysy mantysy . Zawsze jest implikowany 1 bit po lewej stronie jawnej mantysy, a punkt podstawy znajduje się przed tym założonym bitem . Wykładnik jest zakodowany z odchyleniem 128 [ potrzebne źródło ] , więc wykładniki −127…−1 potrzebne [ źródło ] są reprezentowane przez x = 1…127 (01h…7Fh) [ potrzebne źródło ] , wykładniki 0…127 [ potrzebne źródło ] są reprezentowane przez x = 128…255 (80h…FFh) [ potrzebne źródło ] , ze specjalnym przypadkiem dla x = 0 (00h) reprezentujące liczbę całkowitą równą zero.

Format podwójnej precyzji MBF zapewnia mniejszą skalę niż format IEEE 754 i chociaż sam format zapewnia prawie jedną dodatkową cyfrę dziesiętną precyzji, w praktyce przechowywane wartości są mniej dokładne, ponieważ obliczenia IEEE wykorzystują 80-bitowe wyniki pośrednie, a MBF nie 'T. W przeciwieństwie do zmiennoprzecinkowych IEEE, MBF nie obsługuje liczb denormalnych , nieskończoności ani NaN .

Format pojedynczej precyzji MBF (32 bity, „6-cyfrowy BASIC”):

Wykładnik potęgowy Podpisać Znaczący

8 bitów, bity 31–24

1 bit, bit 23

23 bity, bit 22–0
xxxxxxxxx S mmmmmmmmmmmmmmmmmmmmmmmm

Format MBF o rozszerzonej precyzji (40 bitów, „9-cyfrowy BASIC”):

Wykładnik potęgowy Podpisać Znaczący

8 bitów, bity 39–32

1 bit, bit 31

31 bitów, bit 30–0
xxxxxxxxx S mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

Format podwójnej precyzji MBF (64 bity):

Wykładnik potęgowy Podpisać Znaczący

8 bitów, bity 63–56

1 bit, bit 55

55 bitów, bit 54–0
xxxxxxxxx S mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm

Przykłady

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

Zobacz też

Linki zewnętrzne

  • Firma Microsoft udostępnia bibliotekę dołączaną dynamicznie dla 16-bitowego języka Visual Basic, zawierającą funkcje umożliwiające konwersję między danymi MBF a standardem IEEE 754.
    • Ta biblioteka opakowuje funkcje konwersji MBF w 16-bitowym Visual C(++) CRT.
    • Te funkcje konwersji zaokrąglą liczbę podwójnej precyzji IEEE, taką jak ¾ ⋅ 2 −128 do zera, a nie do 2 −128 .
    • W ogóle nie obsługują odchyleń normalnych : liczba pojedynczej precyzji IEEE lub MBF 2-128 zostanie przekonwertowana na zero, mimo że można ją przedstawić w dowolnym formacie.
    • Ta biblioteka jest przeznaczona tylko do użytku z Visual Basic; Oczekuje się, że programy C(++) będą bezpośrednio wywoływać funkcje CRT.