Форматы с плавающей точкой |
---|
IEEE 754 |
|
Другой |
Альтернативы |
Конусная плавающая точка |
В вычислительной технике формат двоичных чисел 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]
На ужине в 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]
Формат MBF с одинарной точностью (32 бита, «6-значный BASIC»): [43] [8]
Экспонента | Знак | Значимая часть |
---|---|---|
Бит 31...24 (8 бит) | Бит 23 (1 бит) | Бит 22...0 (23 бит) |
хххххххх | с | мммммммм мммммммм мммммммм |
Формат MBF повышенной точности (40 бит, «9-значный BASIC»): [8]
Экспонента | Знак | Значимая часть |
---|---|---|
Бит 39...32 (8 бит) | Бит 31 (1 бит) | Бит 30...0 (31 бит) |
хххххххх | с | мммммм мммммммм мммммммм мммммммм |
Формат MBF двойной точности (64 бита): [43] [1]
Экспонента | Знак | Значимая часть |
---|---|---|
Бит 63...56 (8 бит) | Бит 55 (1 бит) | Бит 54...0 (55 бит) |
хххххххх | с | мммммм мммммммм мммммммм мммммммм мммммммм мммммм мммммммм |
{{cite book}}
: |website=
проигнорировано ( помощь ){{cite book}}
: |website=
проигнорировано ( помощь ){{cite book}}
: |website=
проигнорировано ( помощь )[…] В этом документе описывается заброшенный формат данных CompuTrac, который до недавнего времени активно использовался программным обеспечением MetaStock для построения графиков Equis. […]
{{cite web}}
: CS1 maint: числовые имена: список авторов ( ссылка )[…] _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; […]
[…] 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 к показателю степени (один для изменения смещения, один для множителя мантиссы), а затем переставьте биты знака и показателя степени. Дробь не изменится. […]