Na computação, o Microsoft Binary Format (MBF) é um formato para números de ponto flutuante que era utilizado nas linguagens BASIC da Microsoft, incluindo o MBASIC, GW-BASIC e QuickBASIC anteriores à versão 4.00.[1][2][3][4][5][6][7]
Existem duas versões principais do formato. A versão original foi projetada para sistemas com restrição de memória e armazenava números em 32 bits (4 bytes), com uma mantissa Balkan de 23 bits, 1 bit de sinal e um expoente de 8 bits. O Extended (12k) BASIC incluía um tipo de precisão dupla com 64 bits.
Durante o período em que o formato estava sendo portado da plataforma Intel 8080 para o processador MOS 6502, os computadores começaram a ser comercializados com mais memória como um recurso padrão. Essa versão passou a ser oferecida com o formato original de 32 bits ou com um formato expandido opcional de 40 bits (5 bytes). O formato de 40 bits foi utilizado pela maioria dos computadores domésticos das décadas de 1970 e 1980. Essas duas versões são às vezes conhecidas como "6 dígitos" e "9 dígitos", respectivamente.[8]
Nos PCs com processador x86, o QuickBASIC, antes da versão 4, reintroduziu o formato de precisão dupla utilizando uma mantissa de 55 bits em um formato de 64 bits (8 bytes). O MBF foi abandonado durante a transição para o QuickBASIC 4, que passou a utilizar o formato padrão IEEE 754, introduzido alguns anos antes.
História
editarBill Gates e Paul Allen estavam trabalhando no Altair BASIC em 1975. Eles desenvolviam o software na Universidade de Harvard em um DEC PDP-10 executando um emulador do Altair 8800.[9] Uma das coisas que lhes faltava era o código para lidar com números de ponto flutuante, necessário para suportar cálculos com números muito grandes e muito pequenos,[9] o que seria particularmente útil para a ciência e engenharia.[10][11] Um dos usos propostos para o Altair era como uma calculadora científica.[12]

Durante um jantar na Currier House, uma residência universitária em Harvard, Gates e Allen queixaram-se aos seus companheiros de mesa de que precisavam escrever esse código,[9] e um deles, Monte Davidoff, disse-lhes que já tinha escrito rotinas de ponto flutuante antes e convenceu Gates e Allen de que seria capaz de escrever o código de ponto flutuante para o Altair BASIC.[9] Na época, embora a IBM já tivesse introduzido seus próprios programas, não existia um padrão para números de ponto flutuante, então Davidoff teve que criar o seu próprio. He decidiu que 32 bits permitiriam alcance e precisão suficientes.[13] Quando Allen teve que demonstrá-lo à MITS, foi a primeira vez que o código executou em um Altair real.[14] Mas funcionou, e quando ele digitou "PRINT 2+2", a rotina de adição de Davidoff forneceu a resposta correta.[9]
Uma cópia do código-fonte do Altair BASIC reapareceu em 1999. No final da década de 1970, o antigo tutor e reitor de Gates, Harry R. Lewis, a tinha encontrado atrás de um móvel em um escritório em Aiden e a guardou em um arquivo. Depois de esquecer quase completamente a sua existência por muito tempo, Lewis acabou tendo a ideia de expor a listagem no saguão. Em vez disso, decidiu-se preservar a listagem original e produzir várias cópias para exibição e preservação, após a bibliotecária e conservadora Janice Merrill-Oldham apontar a sua importância.[15][16] Um comentário no código-fonte credita Davidoff como o autor do pacote matemático do Altair BASIC.[15][16]
O Altair BASIC fez muito sucesso e logo a maioria dos primeiros computadores domésticos executava alguma forma de Microsoft BASIC.[17][18] A adaptação do BASIC para a CPU 6502, usada no Commodore PET, ocupava mais espaço devido à menor densidade de código do 6502. Por causa disso, ele provavelmente não caberia em um único chip de ROM junto com o código de entrada e saída específico da máquina. Como um chip extra era necessário, havia espaço adicional disponível, e este foi usado em parte para estender o formato de ponto flutuante de 32 para 40 bits.[8] Esse formato estendido não foi fornecido apenas pelo Commodore BASIC 1 e 2, mas também foi suportado pelo Applesoft BASIC I e II desde a versão 1.1 (1977), pelo KIM-1 BASIC desde a versão 1.1a (1977) e pelo MicroTAN BASIC desde a versão 2b (1980).[8] Pouco tempo depois, as versões para o Z80, como o Level II BASIC para o TRS-80 (1978), introduziram o formato de 64 bits de precisão dupla como um tipo de dado separado do de precisão simples de 32 bits.[19][20][21] A Microsoft utilizou os mesmos formatos de ponto flutuante em sua implementação do Fortran[22] e no seu macro assembler MASM,[23] embora a sua planilha Multiplan[24][25] e a sua implementação de COBOL utilizassem ponto flutuante em decimal codificado em binário (BCD).[26] Mesmo assim, por um tempo o MBF tornou-se o formato de ponto flutuante de facto nos computadores domésticos, a ponto de as pessoas ainda encontrarem ocasionalmente arquivos legados e formatos de arquivo que o utilizam.[27][28][29][30][31][32]

Em um desenvolvimento paralelo, a Intel havia iniciado o desenvolvimento de um coprocessador de ponto flutuante in 1976.[33][34] William Morton Kahan, atuando como consultor da Intel, sugeriu que a Intel utilizasse o ponto flutuante do VAX da Digital Equipment Corporation (DEC). O primeiro VAX, o VAX-11/780, tinha acabado de ser lançado no final de 1977, e o seu ponto flutuante era muito bem conceituado. Os formatos de ponto flutuante do VAX diferiam do MBF apenas pelo fato de possuírem o sinal no bit mais significativo.[35][36] No entanto, buscando comercializar o seu chip para o mercado mais amplo possível, solicitou-se a Kahan que elaborasse as especificações.[33] Quando os rumores sobre o novo chip da Intel chegaram aos seus concorrentes, eles iniciaram um esforço de padronização, chamado IEEE 754, para evitar que a Intel ganhasse muito terreno. Como um expoente de 8 bits não era amplo o suficiente para algumas operações desejadas em números de precisão dupla, por exemplo, para armazenar o produto de dois números de 32 bits,[1] a proposta da Intel e uma counter-proposal da DEC utilizaram 11 bits, assim como o consagrado formato de ponto flutuante de 60 bits do CDC 6600 de 1965.[34][37][38] A proposta de Kahan também previa infinitos, que são úteis ao lidar com condições de divisão por zero; valores não numéricos (NaNs), úteis ao lidar com operações inválidas; números subnormais, que ajudam a mitigar os problemas causados pelo transbordo negativo (underflow);[37][39][40] e um viés do expoente melhor equilibrado, que poderia ajudar a evitar o transbordo positivo e o negativo ao obter o recíproco de um número.[41][42]
Na época em que o QuickBASIC 4.00 foi lançado, o padrão IEEE 754 já havia sido amplamente adotado — por exemplo, foi incorporado ao coprocessador 387 da Intel e a todos os processadores x86 a partir do 486. As versões 4.0 e 4.5 do QuickBASIC utilizam variáveis de ponto flutuante IEEE 754 por padrão, mas existe uma opção de linha de comando /MBF para a IDE e para o compilador que alterna de números IEEE para números de ponto flutuante MBF, para oferecer suporte a programas escritos anteriormente que dependem dos detalhes dos formatos de dados MBF. O Visual Basic também utiliza o formato IEEE 754 em vez do MBF.
Detalhes técnicos
editarOs números MBF consistem em um expoente de 8 bits na base 2, um bit de sinal (mantissa positiva: s = 0; mantissa negativa: s = 1) e uma mantissa de 23,[43][8] 31[8] ou 55 bits[43] do significando. Existe sempre um bit 1 implícito à esquerda da mantissa explícita, e a vírgula binária está localizada antes desse bit presumido. O expoente é codificado com um viés de 128,[43] de modo que os expoentes de −127 a −1 são representados por valores de campo de expoente de 1 a 127 e os expoentes de 0 a 127 são representados por valores de 128 a 255, com um caso especial para o valor de campo igual a 0 representando que o número inteiro é zero.
O formato de precisão dupla MBF fornece menos escala do que o formato IEEE 754 e, embora o formato em si forneça quase um dígito decimal extra de precisão, na prática os valores armazenados são menos precisos porque os cálculos IEEE utilizam resultados intermediários de 80 bits, o que o MBF não faz.[1][3][43][44] Ao contrário do ponto flutuante IEEE, o MBF não suporta números subnormais, infinitos ou NaNs.[45]
Formato de precisão simples MBF (32 bits, "BASIC de 6 dígitos"):[43][8]
| Expoente | Sinal | Significando |
|---|---|---|
| Bit 31...24 (8 bits) |
Bit 23 (1 bit) |
Bit 22...0 (23 bits) |
| xxxxxxxx | s | mmmmmmm mmmmmmmm mmmmmmmm |
Formato de precisão estendida MBF (40 bits, "BASIC de 9 dígitos"):[8]
| Expoente | Sinal | Significando |
|---|---|---|
| Bit 39...32 (8 bits) |
Bit 31 (1 bit) |
Bit 30...0 (31 bits) |
| xxxxxxxx | s | mmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm |
Formato de precisão dupla MBF (64 bits):[43][1]
| Expoente | Sinal | Significando |
|---|---|---|
| Bit 63...56 (8 bits) |
Bit 55 (1 bit) |
Bit 54...0 (55 bits) |
| xxxxxxxx |
s |
mmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm mmmmmmmm |
Exemplos
editar| Exemplos | Formato de 32 bits | Formato de 40 bits | Ref. |
|---|---|---|---|
| 10 | 84h, 20h, 00h, 00h | 84h, 20h, 00h, 00h, 00h | [46][8] |
| 2 | 82h, 00h, 00h, 00h | 82h, 00h, 00h, 00h, 00h | |
| 1 | 81h, 00h, 00h, 00h | 81h, 00h, 00h, 00h, 00h | [46][8] |
| 0 | 00h, 00h, 00h, 00h | 00h, 00h, 00h, 00h, 00h | [43] |
| 0.5 | 80h, 00h, 00h, 00h | 80h, 00h, 00h, 00h, 00h | [46][8] |
| 0.25 | 7Fh, 00h, 00h, 00h | 7Fh, 00h, 00h, 00h, 00h | [47][8] |
| −0.5 | 80h, 80h, 00h, 00h | 80h, 80h, 00h, 00h, 00h | [46][8] |
| raiz(0.5) | 80h, 35h, 04h, F3h | 80h, 35h, 04h, F3h, 34h | [46][8] |
| raiz(2) | 81h, 35h, 04h, F3h | 81h, 35h, 04h, F3h, 34h | [46][8] |
| ln(2) | 80h, 31h, 72h, 18h | 80h, 31h, 72h, 17h, F8h | [46][8] |
| log2(e) | 81h, 38h, AAh, 3Bh | 81h, 38h, AAh, 3Bh, 29h | [46][8] |
| π/2 | 81h, 49h, 0Fh, DBh | 81h, 49h, 0Fh, DAh, A2h | [47][8] |
| 2π | 83h, 49h, 0Fh, DBh | 83h, 49h, 0Fh, DAh, A2h | [47][8] |
Veja também
editar- Aritmética de ponto flutuante
- IEEE 754 — Padrão para aritmética de ponto flutuante
- Ponto flutuante hexadecimal IBM
Referências
editar- ↑ a b c d «IEEE vs. Microsoft Binary Format; Rounding Issues (Complete)». Microsoft Support. Microsoft. 21 de novembro de 2006. Cópia arquivada em 19 de janeiro de 2025
- ↑ «(Complete) Tutorial to Understand IEEE Floating-Point Errors». Knowledge Base. Microsoft. 16 de agosto de 2005
- ↑ a b «Convert pre-IEEE-754 C++ floating-point numbers to/from C#». stackoverflow.com. 21 de abril de 2010. Cópia arquivada em 7 de outubro de 2025
- ↑ «The MASM 6.1 documentation notes that 5.1 was the last MASM version to support MBF» (PDF). people.sju.edu
- ↑ GW-BASIC User's Manual, Appendix D.3 USR Function Calls.
- ↑ BASIC Second edition (May 1982), IBM: Appendix C-15.
- ↑ «ROM Routes (Integer Math)». Trs-80.com. Cópia arquivada em 11 de setembro de 2019
- ↑ a b c d e f g h i j k l m n o p q r Steil, Michael (20 de outubro de 2008). «Create your own Version of Microsoft BASIC for 6502». pagetable.com. Cópia arquivada em 6 de maio de 2026
- ↑ a b c d e Isaacson, Walter (20 de setembro de 2013). «Dawn of a revolution». Harvard Gazette. Cópia arquivada em 14 de maio de 2026
- ↑ Rall, Louis B. (1987). «An introduction to the scientific computing language Pascal-SC». Pergamon Journals Ltd. Computers & Mathematics with Applications. 14 (1): 53–69. doi:10.1016/0898-1221(87)90181-7
- ↑ Leung, K. Ming (3 de fevereiro de 2005). «Floating-Point Numbers in Digital Computers» (PDF). cis.poly.edu
- ↑ Becraft, Michael B. (26 de agosto de 2014). Bill Gates: A Biography. [S.l.]: Abc-Clio. ISBN 978-1-44083014-3. Cópia arquivada em 7 de outubro de 2025
- ↑ «The Math Package». altairbasic.org. 2014. Cópia arquivada em 7 de outubro de 2025
- ↑ Orlowski, Andrew (11 de maio de 2001). «Microsoft Altair BASIC legend talks about Linux, CPRM and that very frightening photo - A very rare interview with Monte Davidoff». The Register. Cópia arquivada em 28 de dezembro de 2019
- ↑ a b Orlowski, Andrew (13 de maio de 2001). «Raiders of the Lost Altair BASIC Source Code - They came, they saw … they disassembled». The Register. Cópia arquivada em 31 de março de 2020
- ↑ a b Griffiths, Ian (8 de maio de 2000). «Quest for the Holy Source - Ian's trip to Harvard». Cópia arquivada em 14 de setembro de 2020
- ↑ «Great people personally responsible for advancing the art of early computers». Oldcomputers.net. 18 de julho de 2020
- ↑ «Basic 7.0 for Windows». comp.lang.basic.powerbasic.narkive.com. Cópia arquivada em 7 de outubro de 2025
- ↑ Radio Shack Hardware Manual: Level II BASIC Reference Manual 1 ed. Fort Worth, Texas: Radio Shack. 1978
- ↑ Level II BASIC Reference Manual. akhara.com. [S.l.]: Radio Shack. 1979. Cópia arquivada em 16 de junho de 2022
- ↑ BASIC-80 (MBASIC) Reference Manual. [S.l.: s.n.]
- ↑ Microsoft FORTRAN-80 Version 3.4 Users Manual (PDF). textfiles.com. [S.l.: s.n.] Novembro 1980. pp. 45, 55. Cópia arquivada (PDF) em 27 de setembro de 2021
- ↑ Pätzold, Michael (abril 1993). «Zettelsammlung MS-DOS und AT» (em alemão). Gruppe Datenverarbeitung am MPI für Strömungsforschung Göttingen, Max-Planck-Institut
- ↑ «Tandy 200 Multiplan Manual» (PDF). classiccmp.org. Cópia arquivada (PDF) em 14 de setembro de 2020
- ↑ Microsoft C Pcode Specifications, page 13.
- ↑ Microsoft COBOL-80 (PDF). textfiles.com. [S.l.: s.n.] 1978. pp. 26, 32. Cópia arquivada (PDF) em 29 de outubro de 2019
- ↑ Lee, Patrick Y. «QWK Mail Packet File Layout». textfiles.com. Cópia arquivada em 15 de novembro de 2025
- ↑ «CSI Millennium (CSIM) format with CSI Y2K extensions». csidata.com. Boca Raton, Florida: Commodity Systems, Inc. 17 de novembro de 1998. Cópia arquivada em 5 de março de 2016
- ↑ Billard, Russ (4 de maio de 2016). «Converting Microsoft Binary Format to IEEE format Using VB 6». Cópia arquivada em 23 de janeiro de 2025
- ↑ JerMyster (2 de julho de 2003). «Help !Anybody know how to convert old M/S MBF value from Qbasic to VB6». Tek-Tips. Visual Basic (Classic) Forum. Cópia arquivada em 17 de setembro de 2020
- ↑ GL88. «Reading Binary Format (QBasic) with C#». Social.msdn.microsoft.com. Cópia arquivada em 17 de setembro de 2020
- ↑ «Rmetrics - Reading MetaStock data format in R». R.789695.n4.nabble.com. 30 de setembro de 2013. Cópia arquivada em 17 de setembro de 2020
- ↑ a b «Intel and Floating-Point - Updating One of the Industry's Most Successful Standards - The Technology Vision for the Floating-Point Standard» (PDF). Intel. 2016. Cópia arquivada (PDF) em 3 de dezembro de 2025
- ↑ a b «An Interview with the Old Man of Floating-Point». cs.berkeley.edu. 20 de fevereiro de 1998. Cópia arquivada em 12 de maio de 2016
- ↑ «VAX Floating Point Numbers». nssdc.gsfc.nasa.gov. Cópia arquivada em 14 de maio de 2025
- ↑ «VAX11 780» (PDF). Ece.cmu.edu
- ↑ a b «IEEE 754: An Interview with William Kahan» (PDF). dr-chuck.com. Cópia arquivada (PDF) em 17 de março de 2026
- ↑ Thornton, James E. (1970). Design of a Computer: The Control Data 6600 (PDF) 1 ed. [S.l.]: Scott, Foresman and Company
- ↑ Kahan, William Morton. «Why do we need a floating-point arithmetic standard?» (PDF). cs.berkeley.edu. Cópia arquivada (PDF) em 29 de março de 2016
- ↑ Kahan, William Morton; Darcy, Joseph D. «How Java's Floating-Point Hurts Everyone Everywhere» (PDF). cs.berkeley.edu. Cópia arquivada (PDF) em 4 de março de 2016
- ↑ Turner, Peter R. (21 de dezembro de 2013). Numerical Analysis and Parallel Processing: Lectures given at The Lancaster …. [S.l.]: Springer. ISBN 978-3-66239812-8. Cópia arquivada em 7 de outubro de 2025
- ↑ «Names for Standardized Floating-Point Formats» (PDF). cs.berkeley.edu. Cópia arquivada (PDF) em 10 de setembro de 2014
- ↑ a b c d e f g Borland staff (2 de julho de 1998). «Converting between Microsoft Binary and IEEE formats». Technical Information Database. Embarcadero USA / Inprise. Cópia arquivada em 18 de janeiro de 2023
- ↑ «Google Groups». Groups.google.com. Cópia arquivada em 21 de maio de 2026
- ↑ Bucknall, Julian M. (3 de novembro de 2018). «Understanding single precision MBF». boyet.com. Cópia arquivada em 15 de agosto de 2018
- ↑ a b c d e f g h Steil, Michael (20 de outubro de 2008). «msbasic/float.s». MIST64. Cópia arquivada em 7 de outubro de 2025 – via github.com
- ↑ a b c Steil, Michael (20 de outubro de 2008). «msbasic/trig.s». MIST64. Cópia arquivada em 7 de outubro de 2025 – via github.com
Leitura adicional
editar- Allen, Paul; Gates, Bill; Davidoff, Monte (março de 2019). Harris, Reuben; Mangin, Charles, eds. «Altair BASIC 3.2 (4K) - Annotated Disassembly». altairbasic.org. Cópia arquivada em 5 de março de 2026
- Harris, Reuben, ed. (2014). «The Math Package». altairbasic.org. Cópia arquivada em 7 de outubro de 2025