Существуют две основные версии формата. Первоначальная версия была разработана для систем с ограниченной памятью и хранила числа в 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]
На ужине в 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]
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]
Параллельно 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]
^ abcd "IEEE vs. Microsoft Binary Format; Rounding Issues (Complete)". Поддержка Microsoft . Microsoft . 2006-11-21. Идентификатор статьи KB35826, Q35826. Архивировано из оригинала 2020-08-28 . Получено 2010-02-24 .
^ "(Полное) руководство по пониманию ошибок с плавающей точкой IEEE". База знаний . Microsoft . 2005-08-16. Идентификатор статьи KB42980, Q42980. Архивировано из оригинала 2020-08-28 . Получено 2016-06-02 .
^ 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 в строку.)
^ "В документации MASM 6.1 указано, что 5.1 была последней версией MASM, поддерживающей MBF" (PDF) . people.sju.edu . Получено 2016-06-02 .
^ Руководство пользователя GW-BASIC, Приложение D.3 Вызовы функций USR.
↑ BASIC Второе издание (май 1982 г.), IBM: Приложение C-15 (Примечание. Это руководство по BASICA).
^ abcdefghijklmnopqr Steil, Michael (2008-10-20). "Создайте собственную версию Microsoft BASIC для 6502". pagetable.com. Архивировано из оригинала 2016-05-30 . Получено 2016-05-30 .
^ Leung, K. Ming (2005-02-03) [2000]. "Числа с плавающей точкой в цифровых компьютерах" (PDF) . cis.poly.edu . Кафедра компьютерных и информационных наук, Политехнический университет. Архивировано (PDF) из оригинала 2018-12-14 . Получено 2016-06-02 .
^ Бекрафт, Майкл Б. (2014-08-26). Билл Гейтс: Биография. Abc-Clio. ISBN978-1-44083014-3. Получено 2016-05-30 .
^ Орловски, Эндрю (2001-05-11). "Легенда Microsoft Altair BASIC рассказывает о Linux, CPRM и той очень пугающей фотографии - Очень редкое интервью с Монте Давидоффом". The Register . Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
^ 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 .
^ ab Griffiths, Ian (2000-05-08). "Quest for the Holy Source - поездка Яна в Гарвард". Архивировано из оригинала 2002-01-02 . Получено 2016-05-30 .
^ «Великие люди, лично ответственные за продвижение искусства ранних компьютеров». Oldcomputers.net . 2020-07-18. Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
^ "Basic 7.0 для Windows". comp.lang.basic.powerbasic.narkive.com . Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
^ Radio Shack Hardware Manual: Level II BASIC Reference Manual (1-е изд.). Форт-Уорт, Техас: Radio Shack . 1978. Архивировано из оригинала 28-08-2020 . Получено 30-05-2016 .[1]
^ Справочное руководство по базовому уровню II (PDF) . Radio Shack . 1979 . Получено 2016-06-02 .{{cite book}}: |website=проигнорировано ( помощь )
^ Справочное руководство BASIC-80 (MBASIC) (PDF) . Получено 2016-05-30 .
^ Microsoft FORTRAN-80 Version 3.4 User Manual (PDF) . Ноябрь 1980. С. 45, 55. Получено 30 мая 2016 г.{{cite book}}: |website=проигнорировано ( помощь )
^ Петцольд, Майкл, изд. (апрель 1993 г.). «Zettelsammlung MS-DOS und AT» (на немецком языке). Gruppe Datenverarbeitung am MPI für Strömungsforschung Göttingen, Институт Макса Планка. Архивировано из оригинала 20 февраля 2005 г. Проверено 7 октября 2015 г.
^ Microsoft C Pcode Specifications, стр. 13. (Примечание. Multiplan не был скомпилирован в машинный код, а в своего рода байт-код , который запускался интерпретатором, чтобы сделать Multiplan переносимым на разнообразное оборудование того времени. Этот байт-код различал машинно-зависимый формат с плавающей точкой для вычислений и внешний (стандартный) формат, который представлял собой двоично-десятичный формат (BCD). Инструкции PACK и UNPACK преобразовывались между ними.)
^ Microsoft COBOL-80 (PDF) . 1978. стр. 26, 32. Получено 30 мая 2016 г.{{cite book}}: |website=проигнорировано ( помощь )
^ "Формат CSI Millennium (CSIM) с расширениями CSI Y2K". csidata.com . Бока-Ратон, Флорида: Commodity Systems, Inc. 1998-11-17. Архивировано из оригинала (TXT) 2016-03-05 . Получено 2016-06-02 . […] В этом документе описывается заброшенный формат данных CompuTrac, который до недавнего времени активно использовался программным обеспечением MetaStock для построения графиков Equis. […]
^ Биллард, Расс (2016-05-04) [2001-07-13]. "Преобразование двоичного формата Microsoft в формат IEEE с помощью VB 6". Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
^ JerMyster (2003-07-02). "Помогите! Кто-нибудь знает, как преобразовать старое значение M/S MBF из Qbasic в VB6". Tek-Tips . Форум Visual Basic (Classic). Архивировано из оригинала 2020-08-28 . Получено 2016-05-30 .
^ GL88. "Чтение двоичного формата (QBasic) с помощью C#". Social.msdn.microsoft.com . Получено 2016-05-30 .{{cite web}}: CS1 maint: числовые имена: список авторов ( ссылка )
^ "Rmetrics - Чтение формата данных MetaStock в R". R.789695.n4.nabble.com. 2013-09-30 . Получено 2016-05-30 .
^ ab "Intel и вычисления с плавающей точкой — обновление одного из самых успешных стандартов в отрасли — технологическое видение стандарта с плавающей точкой" (PDF) . Intel . 2016. Архивировано из оригинала (PDF) 2016-03-04 . Получено 2016-05-30 .(11 страниц)
^ ab "Интервью со старым человеком с плавающей точкой". cs.berkeley.edu. 1998-02-20 . Получено 2016-05-30 .
^ "VAX Floating Point Numbers". nssdc.gsfc.nasa.gov . Архивировано из оригинала 2020-08-28 . Получено 2016-06-02 .(Примечание. VAX-11/780 пока не реализовал формат «G». Хотя это не очевидно из таблиц, поскольку структуры были разделены на двухбайтовые слова, порядок байтов фактически такой же, как в современных процессорах. В диапазоне экспоненты недостаточно места для NaN, бесконечности, бесконечностей или денормалей.)
^ ab "IEEE 754: Интервью с Уильямом Кэханом" (PDF) . dr-chuck.com . Получено 2016-06-02 .
^ Торнтон, Джеймс Э. (1970). Написано в Advanced Design Laboratory, Control Data Corporation. Проектирование компьютера: Control Data 6600 (PDF) (1-е изд.). Гленвью, Иллинойс: Scott, Foresman and Company . LCCN 74-96462. Архивировано (PDF) из оригинала 28-08-2020 . Получено 02-06-2016 .(1+13+181+2+2 страницы)
^ Кахан, Уильям Мортон . "Зачем нам нужен стандарт арифметики с плавающей точкой?" (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
^ Кахан, Уильям Мортон ; Дарси, Джозеф Д. «Как плавающая точка Java вредит всем и везде» (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
^ Тернер, Питер Р. (2013-12-21). Численный анализ и параллельная обработка: Лекции, прочитанные в Ланкастере…. Springer. ISBN978-3-66239812-8. Получено 2016-05-30 .
^ "Имена для стандартизированных форматов с плавающей точкой" (PDF) . cs.berkeley.edu . Получено 2016-06-02 .
^ abcdef Сотрудники Borland (1998-07-02) [1994-03-10]. "Преобразование между форматами Microsoft Binary и IEEE". Техническая информационная база данных (TI1431C.txt). Embarcadero USA / Inprise (первоначально: Borland ). Идентификатор 1400. Архивировано из оригинала 2019-02-20 . Получено 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; […]
^ 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 к показателю степени (один для изменения смещения, один для множителя мантиссы), а затем переставьте биты знака и показателя степени. Дробь не изменится. […]
^ 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 различных машин от разных поставщиков.)
^ 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 различных машин от разных поставщиков.)