collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

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

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

Offline beirao

  • Mini Robot
  • *
  • Mensagens: 1.531
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.733
  • 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.531
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.753
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.733
  • 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: 798
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.598
    • 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.531
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