stringtranslate.com

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

В вычислительной технике формат двоичных чисел Microsoft ( MBF ) — это формат чисел с плавающей точкой , который использовался в языках BASIC компании Microsoft , включая MBASIC , GW-BASIC и QuickBASIC до версии 4.00. [1] [2] [3] [4] [5] [6] [7]

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

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

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

История

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

Передняя панель Альтаир 8800

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

Копия исходного кода Altair BASIC всплыла в 1999 году. В конце 1970-х годов бывший наставник и декан Гейтса Гарри Льюис нашел ее за мебелью в офисе в Эйдене и положил в картотечный шкаф. После того, как он на долгое время забыл о ее существовании, Льюис в конце концов придумал выставить листинг в вестибюле. Вместо этого было решено сохранить оригинальный листинг и сделать несколько копий для показа и сохранения, после того как библиотекарь и хранитель Джанис Меррилл-Олдхэм указала на его важность. [15] [16] В комментарии к источнику Давидофф упоминается как автор математического пакета Altair BASIC. [15] [16]

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

Altair BASIC взлетел, и вскоре большинство ранних домашних компьютеров работали на той или иной форме Microsoft BASIC. [17] [18] Порт BASIC для процессора 6502 , такой как используемый в Commodore PET , занимал больше места из-за меньшей плотности кода 6502. Из-за этого он, скорее всего, не поместился бы в одну микросхему ПЗУ вместе с машинно-специфичным кодом ввода и вывода. Поскольку была необходима дополнительная микросхема, было доступно дополнительное пространство, и это частично использовалось для расширения формата с плавающей точкой с 32 до 40 бит. [8] Этот расширенный формат был предоставлен не только Commodore BASIC 1 и 2, но также поддерживался Applesoft BASIC I и II с версии 1.1 (1977), KIM-1 BASIC с версии 1.1a (1977) и MicroTAN BASIC с версии 2b (1980). [8] Вскоре после этого порты Z80 , такие как Level II BASIC для TRS-80 (1978), представили 64-битный формат двойной точности как отдельный тип данных от 32-битного формата одинарной точности. [19] [20] [21] Microsoft использовала те же форматы с плавающей точкой в ​​своей реализации Fortran [22] и для своего макроассемблера MASM , [23] хотя их электронные таблицы Multiplan [24] [25] и их реализация COBOL использовали двоично-десятичные (BCD) числа с плавающей точкой. [26] Тем не менее, на некоторое время MBF стал фактическим форматом с плавающей точкой на домашних компьютерах, до такой степени, что люди до сих пор иногда сталкиваются с устаревшими файлами и форматами файлов, использующими его. [27] [28] [29] [30] [31] [32]

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

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

К моменту выхода 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-, [43] [8] 31- [8] или 55-битной [43] мантиссы значащей части . Всегда подразумевается 1-бит слева от явной мантиссы, а точка основания располагается перед этим предполагаемым битом . Экспонента кодируется со смещением 128 [ требуется ссылка ] , так что показатели −127…−1 [ требуется ссылка ] представлены как x = 1… 127 (01h…7Fh) [ требуется ссылка ] , показатели 0…127 [ требуется ссылка ] представлены как x = 128…255 (80h…FFh) [ требуется ссылка ] , с особым случаем для x = 0 (00h), представляющим целое число, равное нулю.

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

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

Формат MBF повышенной точности (40 бит, «9-значный BASIC»): [8]

Формат MBF двойной точности (64 бита): [43] [1]

Примеры

32-битный формат: 84h, 20h, 00h, 00h
40-битный формат: 84h, 20h, 00h, 00h, 00h
32-битный формат: 82h, 00h, 00h, 00h
40-битный формат: 82h, 00h, 00h, 00h, 00h
32-битный формат: 81h, 00h, 00h, 00h
40-битный формат: 81h, 00h, 00h, 00h, 00h
32-битный формат: 00h, 00h, 00h, 00h (или 00h, xxh, xxh, xxh)
40-битный формат: 00h, 00h, 00h, 00h, 00h (или 00h, xxh, xxh, xxh, xxh)
32-битный формат: 80h, 00h, 00h, 00h
40-битный формат: 80h, 00h, 00h, 00h, 00h
32-битный формат: 7Fh, 00h, 00h, 00h
40-битный формат: 7Fh, 00h, 00h, 00h, 00h
32-битный формат: 80h, 80h, 00h, 00h
40-битный формат: 80h, 80h, 00h, 00h, 00h
32-битный формат: 80h, 35h, 04h, F3h
40-битный формат: 80h, 35h, 04h, F3h, 34h
32-битный формат: 81h, 35h, 04h, F3h
40-битный формат: 81h, 35h, 04h, F3h, 34h
32-битный формат: 80h, 31h, 72h, 18h
40-битный формат: 80h, 31h, 72h, 17h, F8h
32-битный формат: 81h, 38h, AAh, 3Bh
40-битный формат: 81h, 38h, AAh, 3Bh, 29h
32-битный формат: 81h, 49h, 0Fh, DBh
40-битный формат: 81h, 49h, 0Fh, DAh, A2h.
32-битный формат: 83h, 49h, 0Fh, DBh
40-битный формат: 83h, 49h, 0Fh, DAh, A2h.

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

Ссылки

  1. ^ abcd "IEEE vs. Microsoft Binary Format; Rounding Issues (Complete)". Поддержка Microsoft . Microsoft . 2006-11-21. Идентификатор статьи KB35826, Q35826. Архивировано из оригинала 2020-08-28 . Получено 2010-02-24 .
  2. ^ "(Полное) руководство по пониманию ошибок с плавающей точкой IEEE". База знаний . Microsoft . 2005-08-16. Идентификатор статьи KB42980, Q42980. Архивировано из оригинала 2020-08-28 . Получено 2016-06-02 .
  3. ^ ab "Преобразование чисел с плавающей точкой C++ до IEEE-754 в/из C#". stackoverflow.com . 2010-04-21. Архивировано из оригинала 2020-08-28 . Получено 2016-06-02 .(Примечание. Вторая ссылка может быть ошибочной, утверждая, что QB 4.0 может использовать MBF внутренне, но он использует только IEEE. Он просто имеет несколько функций преобразования для преобразования чисел с плавающей точкой IEEE в строки, содержащие данные MBF, например, MKDMBF$ в дополнение к MKD$ , которая просто копирует байты значения IEEE в строку.)
  4. ^ "В документации MASM 6.1 указано, что 5.1 была последней версией MASM, поддерживающей MBF" (PDF) . people.sju.edu . Получено 2016-06-02 .
  5. ^ Руководство пользователя GW-BASIC, Приложение D.3 Вызовы функций USR.
  6. BASIC Второе издание (май 1982 г.), IBM: Приложение C-15 (Примечание. Это руководство по BASICA).
  7. ^ "ПЗУ-маршруты (целочисленная математика)". Trs-80.com . Получено 2016-06-02 .
  8. ^ abcdefghijklmnopqr Steil, Michael (2008-10-20). "Создайте собственную версию Microsoft BASIC для 6502". pagetable.com. Архивировано из оригинала 2016-05-30 . Получено 2016-05-30 .
  9. ^ abcde Айзексон, Уолтер (2013-09-20). «Рассвет революции». Harvard Gazette . news.harvard.edu. Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  10. ^ Ралл, Луис Б. (1987). «Введение в язык научных вычислений Pascal-SC». Компьютеры и математика с приложениями . 14 (1). Центр математических исследований, Университет Висконсин-Мэдисон , Мэдисон, Висконсин: Pergamon Journals Ltd : 53–69. doi : 10.1016/0898-1221(87)90181-7 .(17 страниц)
  11. ^ Leung, K. Ming (2005-02-03) [2000]. "Числа с плавающей точкой в ​​цифровых компьютерах" (PDF) . cis.poly.edu . Кафедра компьютерных и информационных наук, Политехнический университет. Архивировано (PDF) из оригинала 2018-12-14 . Получено 2016-06-02 .
  12. ^ Becraft, Michael B. (2014-08-26). Билл Гейтс: Биография. Abc-Clio. ISBN 978-1-44083014-3. Получено 2016-05-30 .
  13. ^ "The Math Package". altairbasic.org . 2014. Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .(Примечание. Altair BASIC 3.2 (4K Edition).)
  14. ^ Орловски, Эндрю (2001-05-11). "Легенда Microsoft Altair BASIC рассказывает о Linux, CPRM и той очень пугающей фотографии - Очень редкое интервью с Монте Давидоффом". The Register . Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  15. ^ ab Орловски, Эндрю (13.05.2001). "Raiders of the Lost Altair BASIC Source Code - They come, they seen … they disassembled". The Register . Архивировано из оригинала 28.08.2020 . Получено 30.05.2016 .
  16. ^ ab Griffiths, Ian (2000-05-08). "Quest for the Holy Source - поездка Яна в Гарвард". Архивировано из оригинала 2002-01-02 . Получено 2016-05-30 .
  17. ^ «Великие люди, лично ответственные за продвижение искусства ранних компьютеров». Oldcomputers.net . 2020-07-18. Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  18. ^ "Basic 7.0 для Windows". comp.lang.basic.powerbasic.narkive.com . Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  19. ^ Radio Shack Hardware Manual: Level II BASIC Reference Manual (1-е изд.). Форт-Уорт, Техас: Radio Shack . 1978. Архивировано из оригинала 28-08-2020 . Получено 30-05-2016 .[1]
  20. ^ Справочное руководство по базовому уровню II (PDF) . Radio Shack . 1979. Получено 2016-06-02 . {{cite book}}: |website=проигнорировано ( помощь )
  21. ^ Справочное руководство BASIC-80 (MBASIC) (PDF) . Получено 2016-05-30 .
  22. ^ Microsoft FORTRAN-80 Version 3.4 User Manual (PDF) . Ноябрь 1980. С. 45, 55. Получено 30 мая 2016 г. {{cite book}}: |website=проигнорировано ( помощь )
  23. ^ Петцольд, Майкл, изд. (апрель 1993 г.). «Zettelsammlung MS-DOS und AT» (на немецком языке). Gruppe Datenverarbeitung am MPI für Strömungsforschung Göttingen, Институт Макса Планка. Архивировано из оригинала 20 февраля 2005 г. Проверено 7 октября 2015 г.
  24. ^ "Tandy 200 Multiplan Manual" (PDF) . classiccmp.org . Получено 2016-06-02 .
  25. ^ Microsoft C Pcode Specifications, стр. 13. (Примечание. Multiplan не был скомпилирован в машинный код, а в своего рода байт-код , который запускался интерпретатором, чтобы сделать Multiplan переносимым на разнообразное оборудование того времени. Этот байт-код различал машинно-зависимый формат с плавающей точкой для вычислений и внешний (стандартный) формат, который представлял собой двоично-десятичный формат (BCD). Инструкции PACK и UNPACK преобразовывались между ними.)
  26. ^ Microsoft COBOL-80 (PDF) . 1978. стр. 26, 32. Получено 30 мая 2016 г. {{cite book}}: |website=проигнорировано ( помощь )
  27. ^ Ли, Патрик Ю. «Разметка файла почтового пакета QWK» (TXT) . textfiles.com . Получено 2016-06-02 .
  28. ^ "Формат CSI Millennium (CSIM) с расширениями CSI Y2K". csidata.com . Бока-Ратон, Флорида: Commodity Systems, Inc. 1998-11-17. Архивировано из оригинала (TXT) 2016-03-05 . Получено 2016-06-02 . […] В этом документе описывается заброшенный формат данных CompuTrac, который до недавнего времени активно использовался программным обеспечением MetaStock для построения графиков Equis. […]
  29. ^ Биллард, Расс (2016-05-04) [2001-07-13]. "Преобразование двоичного формата Microsoft в формат IEEE с помощью VB 6". Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  30. ^ JerMyster (2003-07-02). "Помогите! Кто-нибудь знает, как преобразовать старое значение M/S MBF из Qbasic в VB6". Tek-Tips . Форум Visual Basic (Classic). Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
  31. ^ GL88. "Чтение двоичного формата (QBasic) с помощью C#". Social.msdn.microsoft.com . Получено 2016-05-30 .{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
  32. ^ "Rmetrics - Чтение формата данных MetaStock в R". R.789695.n4.nabble.com. 2013-09-30 . Получено 2016-05-30 .
  33. ^ ab "Intel и вычисления с плавающей точкой — обновление одного из самых успешных стандартов в отрасли — технологическое видение стандарта с плавающей точкой" (PDF) . Intel . 2016. Архивировано из оригинала (PDF) 2016-03-04 . Получено 2016-05-30 .(11 страниц)
  34. ^ ab "Интервью со старым человеком с плавающей точкой". cs.berkeley.edu. 1998-02-20 . Получено 2016-05-30 .
  35. ^ "VAX Floating Point Numbers". nssdc.gsfc.nasa.gov . Архивировано из оригинала 2020-08-28 . Получено 2016-06-02 .(Примечание. VAX-11/780 пока не реализовал формат «G». Хотя это не очевидно из таблиц, поскольку структуры были разделены на двухбайтовые слова, порядок байтов фактически такой же, как в современных процессорах. В диапазоне экспоненты недостаточно места для NaN, бесконечности, бесконечностей или денормализированных чисел.)
  36. ^ "VAX11 780" (PDF) . Ece.cmu.edu . Получено 2016-06-02 .
  37. ^ ab "IEEE 754: Интервью с Уильямом Кэханом" (PDF) . dr-chuck.com . Получено 2016-06-02 .
  38. ^ Торнтон, Джеймс Э. (1970). Написано в Advanced Design Laboratory, Control Data Corporation. Проектирование компьютера: The Control Data 6600 (PDF) (1-е изд.). Гленвью, Иллинойс: Scott, Foresman and Company . LCCN  74-96462. Архивировано (PDF) из оригинала 28-08-2020 . Получено 02-06-2016 .(1+13+181+2+2 страницы)
  39. ^ Кахан, Уильям Мортон . "Зачем нам нужен стандарт арифметики с плавающей точкой?" (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
  40. ^ Кахан, Уильям Мортон ; Дарси, Джозеф Д. «Как плавающая точка Java вредит всем и везде» (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
  41. ^ Тернер, Питер Р. (2013-12-21). Численный анализ и параллельная обработка: Лекции, прочитанные в Ланкастере…. Springer. ISBN 978-3-66239812-8. Получено 2016-05-30 .
  42. ^ "Имена для стандартизированных форматов с плавающей точкой" (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
  43. ^ abcdef Сотрудники Borland (1998-07-02) [1994-03-10]. "Преобразование между форматами Microsoft Binary и IEEE". Техническая информационная база данных (TI1431C.txt). Embarcadero USA / Inprise (первоначально: Borland ). Идентификатор 1400. Архивировано из оригинала 20.02.2019 . Получено 30.05.2016 . […] _fmsbintoieee(float *src4, float *dest4) […] Двоичный формат MS […] порядок байтов => m3 | m2 | m1 | экспонента […] m1 — старший байт => sbbb|bbbb […] m3 — младший байт […] m = байт мантиссы […] s = знаковый бит […] b = бит […] MBF имеет смещение 128, а IEEE — смещение 127. […] MBF помещает десятичную точку перед предполагаемым битом , тогда как IEEE помещает десятичную точку после предполагаемого бита. […] ieee_exp = msbin[3] - 2; /* на самом деле, msbin[3]-1-128+127 */ […] _dmsbintoieee(double *src8, double *dest8) […] Двоичный формат MS […] порядок байтов => m7 | m6 | m5 | m4 | m3 | m2 | m1 | экспонента […] m1 — старший байт => smmm|mmmm […] m7 — младший байт […] MBF имеет смещение 128, а IEEE — смещение 1023. […] MBF помещает десятичную точку перед предполагаемым битом, тогда как IEEE помещает десятичную точку после предполагаемого бита. […] ieee_exp = msbin[7] - 128 - 1 + 1023; […]
  44. ^ "Google Groups". Groups.google.com . Получено 2016-06-02 .
  45. ^ Bucknall, Julian M. (2018-11-03) [2007-10-23]. "Understanding single precision MBF". boyet.com. Архивировано из оригинала 2019-02-20 . Получено 30-05-2016 . […] IEEE 754 Single format […] Экспонента смещена на 127. Предполагается, что перед точкой счисления стоит 1 бит (поэтому предполагаемая мантисса равна 1.ffff… где f — это биты дроби ) […] Microsoft Binary Format (single precision) […] Экспонента смещена на 128. Предполагается, что после точки счисления стоит 1 бит (поэтому предполагаемая мантисса равна 0.1ffff… где f — это биты дроби) […] мантисса IEEE в два раза больше мантиссы MBF. […] для преобразования из MBF в IEEE single […] вычтите 2 из показателя степени (один для изменения смещения, один для множителя мантиссы), а затем переставьте биты знака и показателя степени. Дробь не изменится. Для преобразования из IEEE single в MBF […] прибавьте 2 к показателю степени (один для изменения смещения, один для множителя мантиссы), а затем переставьте биты знака и показателя степени. Дробь не изменится. […]
  46. ^ abcdefgh Steil, Michael, ed. (2008-10-20). "msbasic/float.s". MIST64 . Архивировано из оригинала 2020-08-28 . Получено 2020-08-28 – через github.com.[2] (Примечание. Прокомментированные листинги дизассемблирования 6502, объединенные из нескольких версий Microsoft BASIC для 6502 между 1977 и 1982 годами для воссоздания точных побайтовых копий оригинальных ПЗУ для 10 различных машин от разных поставщиков.)
  47. ^ abc Steil, Michael, ed. (2008-10-20). "msbasic/trig.s". MIST64 . Архивировано из оригинала 2020-08-28 . Получено 2020-08-28 – через github.com.[3] (Примечание. Прокомментированные листинги дизассемблирования 6502, объединенные из нескольких версий Microsoft BASIC для 6502 между 1977 и 1982 годами для воссоздания байт-точных копий оригинальных ПЗУ для 10 различных машин от разных поставщиков.)

Дальнейшее чтение

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