Números de ponto flutuante
Números de ponto flutuante são uma forma de armazenar números reais em uma quantidade fixa de bits. Esses bits se dividem em:
bit de sinal
valor do expoente
valor do significando (ou mantissa)
O número resultante é calculado pela fórmula sinal × significando × 2 expoente.
No MC1000 os números de ponto flutuante seguem o padrão Microsoft_Binary_Format com quatro bytes, sendo que:
Os dois primeiros bytes e os 7 bits menos significativos do terceiro compõem a parte fracionária do significando. (O primeiro byte é o menos significativo, o terceiro o mais.) Assume-se que há uma parte inteira do significando cujo valor é sempre 1, e que não precisa ser armazenado.
O bit mais significativo do terceiro byte indica o sinal (0 = positivo, 1 = negativo).
Se o quarto byte for zero, o número é zero, independentemente do valor dos outros bytes. Senão, subtrai-se 129 para obter o expoente.
Exemplos de como alguns números são armazenados:
O número 0 é sempre representado por um zero no quarto byte. Os outros são ignorados: [??, ??, ??, 0x00].
O número +1 corresponde a +%1 = +%1,0 × 20. A parte fracionária do significando é zero, e o sinal do número é positivo, então os três primeiros bytes são zero. O expoente é 0 então o quarto byte é 0+129 = 129 = $81. Assim, +1 é representado pelos bytes [$00, $00, $00, $81].
O número +1.024 corresponde a +%10000000000 = +%1,0 × 2+10. A parte fracionária do significando é zero, e o sinal do número é positivo, então os três primeiros bytes são zero. O expoente é +10 então +10+129 = 139 = $8B. Assim, +1.024 é representado pelos bytes [$00, $00, $00, $8B].
O número −0,5 corresponde a −%0,1 = −%1,0 × 2−1. O sinal do número é negativo, então o bit 7 do terceiro byte é 1: %10000000 = $80. O expoente é −1, então o quarto byte é −1+129 = 128 = $80. Assim, −0,5 é representado pelos bytes [$00, $00, $80, $80].
√2 é aproximadamente +1,41421, que corresponde a +%1,01101010000010011110011 = +%1,01101010000010011110011 × 20. Então o primeiro byte é %11110011 = $F3, o segundo byte é %00000100 = $04, o terceiro byte é %00110101 = $35 (bit 7 = 0 indica sinal positivo). O expoente é 0, então o quarto byte é 0+129 = 129 = $81. Assim, +1,41421 é representado pelos bytes [$F3, $04, $35, $81].
Devido ao tamanho do significando, o maior número inteiro que pode ser atingido a partir de zero somando-se 1 sucessivas vezes é 16.777.216. A partir daí a casa das unidades fica fora da "janela" do significando do número e não consegue ser somada.
Outros computadores que usam quatro bytes para a mantissa, como o TRS-80 Color Computer e o ZX Spectrum, chegam a 256 vezes esse valor: 4.294.967.296.
Rotinas da ROM para tratar números de ponto flutuante
Nas descrições abaixo,
FLOAT: É o "acumulador de ponto flutuante", uma variável do sistema de 4 bytes localizada em $03BF–$03C2 / 959–962 onde se armazena o número de ponto flutuante sendo interpretado/calculado/etc. Aqui também se armazenam ponteiros para strings. O endereço $0390 / 912: Indica se o valor armazenado em FLOAT é numérico (0) ou string (≠0).
BCDE: Designamos assim o armazenamento de um número de ponto flutuante nos registradores. B = byte 4, C = byte 3, D = byte 2, E = byte 1.
@HL, @DE: Um número de ponto flutuante (4 bytes) na memória, apontado pelo par de registradores HL ou DE.