collapse

* Links de Robótica

* Posts Recentes

Compra colectiva seeedstudio por beirao
[15 de Dezembro de 2017, 23:06]


Robot Wars International Special por beirao
[12 de Dezembro de 2017, 22:52]


Docker por nnr
[12 de Dezembro de 2017, 13:41]


Comprar transformador de +/-12Volts por jm_araujo
[12 de Dezembro de 2017, 10:16]


Embedded World 2018 por KammutierSpule
[12 de Dezembro de 2017, 09:05]


Esquema Fonte Bancada por almamater
[12 de Dezembro de 2017, 08:13]


Meu projecto - Arm Robot com arduino por Diogo Bento
[11 de Dezembro de 2017, 23:18]


Ajuda Projecto IR / RF por dio123
[09 de Dezembro de 2017, 10:53]


Drivers Arduino UNO! por dio123
[09 de Dezembro de 2017, 10:46]


Problema em converter codigo C arduino para C + Pigpio na raspberry por vasco
[08 de Dezembro de 2017, 19:22]

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

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

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.499
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.404
  • 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.499
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.728
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.404
  • 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: 795
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.150
    • 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.499
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