Двоичный формат Microsoft - Microsoft Binary Format

В вычислении , Microsoft двоичный формат (МБФ) представляет собой формат для чисел с плавающей точкой чисел , которая использовалась в Microsoft «ы BASIC продуктов языка, в том числе MBASIC , GW-BASIC и QuickBASIC перед версией 4.00.

Есть две основные версии формата. Первоначальная версия была разработана для систем с ограничением памяти и сохраняла 32-битные числа (4 байта) с 23-битной мантиссой , 1-битным знаком и 8-битной экспонентой . Расширенный (12k) BASIC включал тип двойной точности с 64 битами.

В период, когда он переносился с платформы Intel 8080 на процессор MOS 6502 , компьютеры начали поставляться с большим объемом памяти в качестве стандартной функции. Эта версия предлагалась с исходным 32-битным форматом или дополнительным расширенным 40-битным (5-байтовым) форматом. 40-битный формат использовался на большинстве домашних компьютеров 1970-х и 1980-х годов. Эти две версии иногда называют «6-значным» и «9-значным» соответственно.

На ПК с процессором x86 QuickBASIC до версии 4 повторно ввел формат двойной точности с использованием 55-битной мантиссы в 64-битном (8-байтовом) формате. От MBF отказались во время перехода на QuickBASIC 4, в котором использовался стандартный формат IEEE 754 , представленный несколькими годами ранее.

История

Билл Гейтс и Пол Аллен работали над Altair BASIC в 1975 году. Они разрабатывали программное обеспечение в Гарвардском университете на DEC PDP-10 под управлением их эмулятора Altair . Единственное, чего им не хватало, так это кода для обработки чисел с плавающей запятой, необходимого для поддержки вычислений с очень большими и очень маленькими числами, что было бы особенно полезно для науки и техники. Одним из предлагаемых вариантов использования Альтаира был научный калькулятор.

Передняя панель Altair 8800

На обеде в Currier House , жилом доме для студентов в Гарварде, Гейтс и Аллен пожаловались своим товарищам по обеду, что им пришлось написать этот код, и один из них, Монте Давидофф , сказал им, что он писал процедуры с плавающей запятой раньше и убедил Гейтсу и Аллену, что он был способен написать код с плавающей запятой Altair BASIC. В то время, когда IBM представила свои собственные программы, стандарта для чисел с плавающей запятой не было, поэтому Давидоффу пришлось придумать свой собственный. Он решил, что 32 бита обеспечат достаточный диапазон и точность. Когда Аллену пришлось продемонстрировать его MITS , это был первый раз, когда он работал на реальном Altair. Но это сработало, и когда он ввел «ПЕЧАТЬ 2 + 2», процедура добавления Давыдова дала правильный ответ.

Исходный код Altair BASIC считался утерянным для истории, но вновь появился в 2000 году. Он находился за картотечкой бывшего наставника Гейтса и декана Гарри Льюиса , который заново его открыл. В комментарии к источнику Давидофф назван автором математического пакета Altair BASIC.

Система Radio Shack Tandy TRS-80 Model I

Альтаир БЕЙСИК стал популярным, и вскоре на большинстве первых домашних компьютеров была установлена ​​некоторая форма БЕЙСИКа от Майкрософт. Порт BASIC для ЦП 6502 , например, используемый в Commodore PET , занимал больше места из-за более низкой плотности кода 6502. Из-за этого он, вероятно, не поместился бы в одну микросхему ПЗУ вместе с машинно-зависимым входом. и выходной код. Поскольку требовался дополнительный чип, было доступно дополнительное пространство, которое частично использовалось для расширения формата с плавающей запятой с 32 до 40 бит. Этот расширенный формат не только предоставлялся Commodore BASIC 1 и 2, но также поддерживался Applesoft BASIC I и II с версии 1.1 (1977), KIM-1 BASIC с версии 1.1a (1977) и MicroTAN BASIC с версии 2b ( 1980). Вскоре после этого в портах Z80 , таких как Level II BASIC для TRS-80 (1978), был введен 64-битный формат с двойной точностью как отдельный тип данных от 32-битного с одинарной точностью. Microsoft использовала одни и те же форматы с плавающей запятой в своей реализации Фортрана и для своего макроассемблера MASM , хотя в их электронной таблице Multiplan и в реализации на языке COBOL использовалась десятичная двоичная кодировка (BCD) с плавающей запятой. Несмотря на это, на какое-то время MBF стал де-факто форматом с плавающей запятой на домашних компьютерах, до такой степени, что люди все еще иногда сталкиваются с устаревшими файлами и форматами файлов, использующими его.

VAX-11/780 миникомпьютер

Параллельно с этим Intel начала разработку сопроцессора с плавающей точкой в 1976 году. Уильям Мортон Кахан , как консультант Intel, предложил Intel использовать плавающую точку VAX корпорации Digital Equipment Corporation (DEC). Первый VAX, VAX-11/780, вышел только в конце 1977 года, и его числа с плавающей запятой пользовались большим успехом. Форматы с плавающей запятой VAX отличались от MBF только тем, что у них был знак в старшем разряде. Однако, стремясь вывести свой чип на максимально широкий рынок, Kahan попросили составить спецификации. Когда слухи о новом чипе Intel достигли своих конкурентов, они начали усилия по стандартизации, названные IEEE 754 , чтобы не дать Intel слишком сильно завоевать позиции. Поскольку 8-битная экспонента была недостаточно широкой для некоторых операций, требуемых для чисел с двойной точностью, например, для хранения произведения двух 32-битных чисел, в предложении Intel и контрпредложении DEC использовалось 11 бит, как проверенный временем 60-битовый формат с плавающей точкой из CDC 6600 из 1965. предложение Kahan также предусмотренные бесконечности, которые полезны при работе с разделением на ноль условий; нечисловые значения, которые полезны при работе с недопустимыми операциями; денормальные числа , которые помогают смягчить проблемы, вызванные недостаточным заполнением; и более сбалансированное смещение экспоненты , которое могло бы помочь избежать переполнения и потери значимости при взятии обратной величины числа.

К тому времени, когда был выпущен QuickBASIC 4.00 , стандарт IEEE 754 получил широкое распространение - например, он был включен в сопроцессор Intel 387 и каждый процессор x86 , начиная с 486-го . QuickBASIC версий 4.0 и 4.5 по умолчанию использует переменные с плавающей запятой IEEE 754, но (по крайней мере, в версии 4.5) есть параметр командной строки / MBF для IDE и компилятора, который переключается с IEEE на числа с плавающей запятой MBF на поддерживают ранее написанные программы, которые полагаются на детали форматов данных MBF. Visual Basic также использует формат IEEE 754 вместо MBF.

Технические подробности

Номер MBF состоит из 8-разрядного базовых 2 показателя , знак бит (положительные мантиссы: s = 0; отрицательная мантисса: s = 1) и 23-, 31- или 55-битные мантиссы мантиссы . Слева от явной мантиссы всегда подразумевается 1 бит, а точка счисления располагается перед этим предполагаемым битом . Показатель кодируется с уклоном в 128 , так что показатели -127 ... -1 представлены х = 1 ... 127 (01h ... 7Fh) , экспоненты 0 ... 127 представлены х = 128 ... 255 (80h ... FFh) , со специальным случаем для x = 0 (00h), представляющим все число, равное нулю.

Формат двойной точности MBF обеспечивает меньший масштаб, чем формат IEEE 754 , и, хотя сам формат обеспечивает почти одну дополнительную десятичную цифру точности, на практике сохраненные значения менее точны, поскольку в расчетах IEEE используются 80-битные промежуточные результаты, а в MBF нет. т. В отличие от операций с плавающей запятой IEEE, MBF не поддерживает денормальные числа , бесконечности или NaN .

Формат MBF с одинарной точностью (32 бита, «6-значный BASIC»):

Экспонента Подписать Значительный
8 бит,
бит 31–24
1 бит,
бит 23
23 бита,
бит 22–0
xxxxxxxx s ммммммммммммммммммммм

Формат расширенной точности MBF (40 бит, "9-значный BASIC"):

Экспонента Подписать Значительный
8 бит,
бит 39–32
1 бит,
бит 31
31 бит,
бит 30–0
xxxxxxxx s ммммммммммммммммммммммммммммм

Формат MBF с двойной точностью (64 бита):

Экспонента Подписать Значительный
8 бит,
бит 63–56
1 бит,
бит 55
55 бит,
бит 54–0
xxxxxxxx s ммммммммммммммммммммммммммммммммммммммммммммммммммм

Примеры

  • «10»:
32-битный формат: 84h, 20h, 00h, 00h
40-битный формат: 84h, 20h, 00h, 00h, 00h
  • «2»:
32-битный формат: 82h, 00h, 00h, 00h
40-битный формат: 82h, 00h, 00h, 00h, 00h
  • «1»:
32-битный формат: 81h, 00h, 00h, 00h
40-битный формат: 81h, 00h, 00h, 00h, 00h
  • «0»:
32-битный формат: 00h, 00h, 00h, 00h (или 00h, xxh, xxh, xxh)
40-битный формат: 00h, 00h, 00h, 00h, 00h (или 00h, xxh, xxh, xxh, xxh)
  • «0,5»:
32-битный формат: 80h, 00h, 00h, 00h
40-битный формат: 80h, 00h, 00h, 00h, 00h
  • «0,25»:
32-битный формат: 7Fh, 00h, 00h, 00h
40-битный формат: 7Fh, 00h, 00h, 00h, 00h
  • «-0,5»:
32-битный формат: 80h, 80h, 00h, 00h
40-битный формат: 80h, 80h, 00h, 00h, 00h
  • "sqrt (0,5)":
32-битный формат: 80h, 35h, 04h, F3h
40-битный формат: 80h, 35h, 04h, F3h, 34h
  • "sqrt (2)":
32-битный формат: 81h, 35h, 04h, F3h
40-битный формат: 81h, 35h, 04h, F3h, 34h
  • "ln (2)":
32-битный формат: 80h, 31h, 72h, 18h
40-битный формат: 80h, 31h, 72h, 17h, F8h
  • "журнал 2 (е)":
32-битный формат: 81h, 38h, AAh, 3Bh
40-битный формат: 81h, 38h, AAh, 3Bh, 29h
  • «пи / 2»:
32-битный формат: 81h, 49h, 0Fh, DBh
40-битный формат: 81h, 49h, 0Fh, DAh, A2h
  • «2 * пи»:
32-битный формат: 83h, 49h, 0Fh, DBh
40-битный формат: 83h, 49h, 0Fh, DAh, A2h

Смотрите также

использованная литература

внешние ссылки

  • Microsoft предоставляет библиотеку динамической компоновки для 16-битного Visual Basic, содержащую функции для преобразования между данными MBF и IEEE 754.
    • Эта библиотека включает функции преобразования MBF в 16-разрядную CRT Visual C (++).
    • Эти функции преобразования округляют число двойной точности IEEE, например ¾ ⋅ 2-128, до нуля, а не до 2 -128 .
    • Они вообще не поддерживают денормализацию : число 2 -128 с одинарной точностью IEEE или MBF будет преобразовано в ноль, даже если оно может быть представлено в любом формате.
    • Эта библиотека предназначена только для использования с Visual Basic; Ожидается, что программы на C (++) будут вызывать функции CRT напрямую.