Página 1 de 1

Float Numbers

MensagemEnviado: 11 Jan 2008 19:37
por Pask
Meus amigos, me esclareçam uma dúvida cruel, por favor: eu escrevi um pequeno programa em C CCS para fazer a soma de duas variáveis do tipo ponto flutuante e armazenar o resultado da soma em uma delas. O pequeno código ficou assim:

float x1, x2;
x1 = 0.5;
x2 = 0.5;
x1 = x1 + x2;

Acompanhando a execução do programa e o resultado da operação no menu FILE REGISTERS do MPLAB, ele me mostrou o seguinte, enquanto o ponteiro passava pelos valores aplicados a x1 e x2:

ENDEREÇO HEX DEC VAR
039 7E 126 x1
03A 00 0
03B 00 0
03C 00 0
03D 7E 126 x2
03E 00 0
03F 00 0
040 00 0

Evidentemente, como as variáveis do tipo float são de 32bits, num sistema de 8 bits elas ocuparão 4 posições da memória de usuário.
Mas, agora vem a pergunta: por que esses valores 0x7E (hex) ou 126 (dec)? De onde eles vieram? Como um valor declarado como 0,5 se transformou em 0x7E ou 126?
Após a soma, o valor de x1 = 1 e o valor de x2 = 0,5, correto?
No menu do MPLAB, ele mostrou os resultados seguintes:

ENDEREÇO HEX DEC VAR
039 7F 127 x1
03A 00 0
03B 00 0
03C 00 0
03D 7E 126 x2
03E 00 0
03F 00 0
040 00 0

Na verdade, o que eu quero saber, é como o compilador C processa essas variáveis tipo ponto flutuante para gerar valores tão estranhos em suas operações matemáticas? Obrigado amigos.

MensagemEnviado: 12 Jan 2008 14:48
por renatokodaira
O melhor documento que explica isso é o AN575 da Microchip que explica o formato de ponto flutuante IEEE754 e o padrão usado pela Microchip (que é o do seu compliador).
O formato dos números floating point 32 da Microchip é:
eeeeeeee smmmmmmm mmmmmmmm mmmmmmmm
onde os bits e significam o expoente do número adicionado a 127 decimal
s é o sinal (0 = positivo, 1 = negativo)
e mais 23 bits de mantissa (obs: o bit mais significativo tem valor ímplicito de 1, portanto não precisa ser representado)

então a conversão é: sinal mantissa x 2 ^ (expoente -127)

Tomando o seu exemplo:

7E 00 00 00
01111110 00000000 000000000 00000000

O expoente é: 126 - 127 = -1
o sinal é positivo (bit MSb do segundo byte)
a mantissa é: 1 (implicito) + 0 (o segundo bit do segundo byte) x 2 ^ -1 + 0 (terceiro bit do segundo byte) x 2 ^ -2 + ....... até o 23 bit = 1,0000000

Então: + 1 x 2 ^ -1 = 0,5

Da mesma forma, para o número 1 temos:
sinal = 0 positivo
expoente = 127 -127 = 0
mantissa = 1,0000000
número = + 1 x 2 ^0 = 1

O número PI seria:
80 49 0F DA
ou
10000000 01001001 00001111 11011010
expoente = 128 - 127 = 1
sinal = 0 positivo
mantissa = 1,57079625
ou: + 1,57079625 x 2 ^ 1 = 3,14159250
Veja que com FP de 32 bits o erro de PI ocorre na setima casa decimal, porque nao se consegue representar com tanta precisão. Números que são de base 2 são representados com precisão.

MensagemEnviado: 12 Jan 2008 19:11
por Pask
Falou amigo. Agora deu para entender de onde vêm esses estranhos valores que aparecem quando se está lidando com números reais em C.
Um abraço para você.

MensagemEnviado: 13 Jan 2008 18:33
por proex
Aqui tem uma boa fonte de informaçao:

http://wwwusers.rdc.puc-rio.br/rmano/rd.html

MensagemEnviado: 13 Jan 2008 19:38
por Pask
Valeu Proex.