collapse

* Links de Robótica

* Posts Recentes

Ajuda Projecto IR / RF por Gb
[Hoje às 16:01]


Medir Agua que está no Poço por edeweld
[Ontem às 09:15]


CNC Laser 60w por nandotx
[15 de Outubro de 2017, 19:01]


Equipar laboratorio por LVirtual
[13 de Outubro de 2017, 08:34]


Arranjo de Berbequim por jm_araujo
[13 de Outubro de 2017, 08:34]


Escolher ligações por dropes
[08 de Outubro de 2017, 23:26]


Perfis V-Slot vs C-Beam vs Bosch vs 8020 por senso
[08 de Outubro de 2017, 18:22]


Ideias para construir um quadrúpede simples por Njay
[07 de Outubro de 2017, 22:12]


Meu projecto - Arm Robot com arduino por Diogo Bento
[05 de Outubro de 2017, 20:54]


Alimentar arduino nano com 12V por helderjsd
[05 de Outubro de 2017, 16:26]

Autor Tópico: Virgula flutuante  (Lida 1159 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.484
Virgula flutuante
« 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.
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.397
  • Helpdesk do sitio
Re: Virgula flutuante
« Responder #1 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.
Avr fanboy

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.484
Re: Virgula flutuante
« Responder #2 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....
"O único lugar onde o sucesso vem antes do trabalho, é no dicionário" - Albert Einstein

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.727
Re: Virgula flutuante
« Responder #3 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 ;)

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.397
  • Helpdesk do sitio
Re: Virgula flutuante
« Responder #4 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.
Avr fanboy

Offline msr

  • Mini Robot
  • *
  • Mensagens: 793
Re: Virgula flutuante
« Responder #5 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.
« Última modificação: 14 de Abril de 2014, 18:20 por msr »

Offline Njay

  • Mini Robot
  • *
  • Mensagens: 3.100
    • Tróniquices
Re: Virgula flutuante
« Responder #6 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);

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.484
Re: Virgula flutuante
« Responder #7 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

Obrigado a todos!

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