Float Numbers

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Float Numbers

Mensagempor Pask » 11 Jan 2008 19:37

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.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor renatokodaira » 12 Jan 2008 14:48

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.
renatokodaira
Byte
 
Mensagens: 402
Registrado em: 11 Out 2006 15:15

Mensagempor Pask » 12 Jan 2008 19:11

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ê.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19

Mensagempor proex » 13 Jan 2008 18:33

Aqui tem uma boa fonte de informaçao:

http://wwwusers.rdc.puc-rio.br/rmano/rd.html
proex
Dword
 
Mensagens: 2101
Registrado em: 11 Out 2006 14:05
Localização: São Paulo

Mensagempor Pask » 13 Jan 2008 19:38

Valeu Proex.
Pask
Word
 
Mensagens: 600
Registrado em: 22 Dez 2006 19:19


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x