• Welcome to LusoRobótica - Robótica em Português.
 

Virgula flutuante

Started by beirao, 14 de April de 2014, 17:47

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

beirao

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.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

senso

Mas é código para implementares?
Não faço ideia o que um autómato sabe falar, mas em C:

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.
Avr fanboy

beirao

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....
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

metRo_

Quote from: beirao on 14 de April 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....

Acho que é melhor colocares um exemplo ;)

senso

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.
Avr fanboy

msr

#5
Portanto queres aceder aos bytes com que é representado um float? Experimenta isto.

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.

Njay

Se os teus bytes vierem por exemplo num

char  raw[4];

e na ordem certa, deves poder fazer

int  i = (int) ((float*)raw);

beirao

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

Obrigado a todos!

"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein