| Formato de ponto flutuante |
|---|
| IEEE 754 |
|
| Outros formatos |
| Alternativas |
| Ponto flutuante afunilado |
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.
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.
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.
Bill 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. 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, o que seria particularmente útil para a ciência e engenharia. Um dos usos propostos para o Altair era como uma calculadora científica.

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, 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. 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. Quando Allen teve que demonstrá-lo à MITS, foi a primeira vez que o código executou em um Altair real. Mas funcionou, e quando ele digitou "PRINT 2+2", a rotina de adição de Davidoff forneceu a resposta correta.
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. Um comentário no código-fonte credita Davidoff como o autor do pacote matemático do Altair BASIC.
O Altair BASIC fez muito sucesso e logo a maioria dos primeiros computadores domésticos executava alguma forma de Microsoft BASIC. 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. 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). 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. A Microsoft utilizou os mesmos formatos de ponto flutuante em sua implementação do Fortran e no seu macro assembler MASM, embora a sua planilha Multiplan e a sua implementação de COBOL utilizassem ponto flutuante em decimal codificado em binário (BCD). 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.

Em um desenvolvimento paralelo, a Intel havia iniciado o desenvolvimento de um coprocessador de ponto flutuante in 1976. 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. No entanto, buscando comercializar o seu chip para o mercado mais amplo possível, solicitou-se a Kahan que elaborasse as especificações. 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, 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. 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); 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.
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.
Os 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, 31 ou 55 bits 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, 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. Ao contrário do ponto flutuante IEEE, o MBF não suporta números subnormais, infinitos ou NaNs.
Formato de precisão simples MBF (32 bits, "BASIC de 6 dígitos"):
| 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"):
| 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):
| 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 | Formato de 32 bits | Formato de 40 bits | Ref. |
|---|---|---|---|
| 10 | 84h, 20h, 00h, 00h | 84h, 20h, 00h, 00h, 00h | |
| 2 | 82h, 00h, 00h, 00h | 82h, 00h, 00h, 00h, 00h | |
| 1 | 81h, 00h, 00h, 00h | 81h, 00h, 00h, 00h, 00h | |
| 0 | 00h, 00h, 00h, 00h | 00h, 00h, 00h, 00h, 00h | |
| 0.5 | 80h, 00h, 00h, 00h | 80h, 00h, 00h, 00h, 00h | |
| 0.25 | 7Fh, 00h, 00h, 00h | 7Fh, 00h, 00h, 00h, 00h | |
| −0.5 | 80h, 80h, 00h, 00h | 80h, 80h, 00h, 00h, 00h | |
| raiz(0.5) | 80h, 35h, 04h, F3h | 80h, 35h, 04h, F3h, 34h | |
| raiz(2) | 81h, 35h, 04h, F3h | 81h, 35h, 04h, F3h, 34h | |
| ln(2) | 80h, 31h, 72h, 18h | 80h, 31h, 72h, 17h, F8h | |
| log2(e) | 81h, 38h, AAh, 3Bh | 81h, 38h, AAh, 3Bh, 29h | |
| π/2 | 81h, 49h, 0Fh, DBh | 81h, 49h, 0Fh, DAh, A2h | |
| 2π | 83h, 49h, 0Fh, DBh | 83h, 49h, 0Fh, DAh, A2h |