LusoRobótica - Robótica em Português

Software => Software e Programação => Tópico iniciado por: beirao em 14 de Abril de 2014, 17:47

Título: Virgula flutuante
Enviado por: beirao em 14 de Abril de 2014, 17:47
viva pessoal,

Alguém me dá uma dica: como posso converter um valor em vírgula flutuante para o seu valor decimal?

Tenho 2 words (4 bytes) que correspondem a um número em vírgula flutuante (IEEE 754). Quero converter para decimal, alguém dá uma dica?

É para implementar num autómato.
Título: Re: Virgula flutuante
Enviado por: senso em 14 de Abril de 2014, 17:51
Mas é código para implementares?
Não faço ideia o que um autómato sabe falar, mas em C:
Código: [Seleccione]
float foo= 1.23;
int32_t bar = 0;

bar = (int32_t)foo; //and now bar is 1

Podes ter de somar + 0.5 á variavel por causa dos arredondamentos.
Título: Re: Virgula flutuante
Enviado por: beirao em 14 de Abril de 2014, 18:03
nao me expliquei bem :)

Tenho duas words, 32 bits, que correspondem a um valor em virgula flutuante mas não tenho  o valor em float. Tipo tenho 32bits em duas variaveis, posso juntar numa variavel e depois converter esses 32bits para uma variavel float....
Título: Re: Virgula flutuante
Enviado por: metRo_ em 14 de Abril de 2014, 18:10
nao me expliquei bem :)

Tenho duas words, 32 bits, que correspondem a um valor em virgula flutuante mas não tenho  o valor em float. Tipo tenho 32bits em duas variaveis, posso juntar numa variavel e depois converter esses 32bits para uma variavel float....

Acho que é melhor colocares um exemplo ;)
Título: Re: Virgula flutuante
Enviado por: senso em 14 de Abril de 2014, 18:12
Os teus dois post são exactamente o oposto um do outro, um queres juntar duas variaveis float e passar para inteiro, no outro são duas variaveis inteiras e queres passar para float.

Um exemplo ou dois seriam bem vindos.
Título: Re: Virgula flutuante
Enviado por: msr em 14 de Abril de 2014, 18:13
Portanto queres aceder aos bytes com que é representado um float? Experimenta isto.

Código: [Seleccione]
typedef union {
  float f_val;
  int i_val;
} IntFloatConverter;

IntFloatConverter conv;

conv.f_val = 123.456;
printf("%08X",conv.i_val);

edit: se for para dupla precisão (double) podes usar o #include <stdint.h>  e usar uint64_t e double na union que coloquei acima. Neste caso podes tambem adicionar à union um array uint32_t i32_array[2]. No entanto esta solução é sensível à "endianess", funciona diferente consoante a máquina seja big ou little endian.
Título: Re: Virgula flutuante
Enviado por: Njay em 14 de Abril de 2014, 18:26
Se os teus bytes vierem por exemplo num

char  raw[4];

e na ordem certa, deves poder fazer

int  i = (int) ((float*)raw);
Título: Re: Virgula flutuante
Enviado por: beirao em 15 de Abril de 2014, 11:12
Obrigado a todos pelas respostas.

Acabei de resolver o problema, e fica a info para futuras dúvidas de alguém.

Tenho duas words (cada word = 2 bytes) que correspondem a um valor em virgula flutuante. Exemplo:
word1 = 52429
word2 = 17012 (word mais significativa)

Ou seja, o valor, em words, é: 1114950861

Como estou a trabalhar num PLC não tenho algumas funções que indicaram. Então fiz um ponteiro para a variavel 1114950861 e depois li o valor do ponteiro através de uma variavel real/float. Tal como está aqui: http://stackoverflow.com/questions/16085959/plc-structured-text-convert-decimal-to-realfloat-not-getting-the-value-i-exp (http://stackoverflow.com/questions/16085959/plc-structured-text-convert-decimal-to-realfloat-not-getting-the-value-i-exp)

Obrigado a todos!