2017-09-12 4 views
-4

Comment puis-je convertir un int 16 bits en un nombre à virgule flottante? J'ai une variable 16 bits signée dont on m'a dit que je devais afficher avec une précision de 3 décimales, donc je présume que cela impliquerait une conversion à float?Conversion int16 pour flotter en C

J'ai essayé ci-dessous ce qui copie juste mes 16 bits dans un flotteur mais ceci ne semble pas juste.

float myFloat = 0; 
int16_t myInt = 0x3e00; 
memcpy(&myFloat, &myInt, sizeof(int)); 

J'ai aussi lu sur le format demi-précision en virgule flottante, mais ne suis pas sûr comment gérer cela ... si je dois.

J'utilise GCC.

mise à jour: La source des données est un tableau char [2] que je reçois d'une interface i2c. Je couds ensuite ceci ensemble dans un int signé.

Quelqu'un peut-il aider?

+0

Hm. Pourquoi est-ce que «int16» est d'abord à la première place? Qu'est-ce que cela représente? –

+5

Votre question n'a aucun sens. Un entier de 16 bits est un nombre entier. Il n'a pas de décimales. –

+3

Je suppose que votre exigence est légèrement plus articulée (à moins qu'ils ne demandent un non-sens). Peut-être que vous avez une valeur 16 bits signée d'un ADC qui doit être convertie en float selon la plage physique d'entrée (que vous ne nous montrez pas) avec une précision de 3 chiffres (ou quelque chose comme ça). Si vous avez une plage de 'int16_t' et une plage de valeur d'entrée alors ... c'est juste une proportion. –

Répondre

1

J'ai une variable signé 16 bits qui me dit que je dois montrer avec une précision de 3 décimales

Si quelqu'un vous a dit la valeur integer peut être affiché de cette façon, il/Elle devrait commencer par le cours C Begginers.

La seule possibilité est que la valeur entière ait été mise à l'échelle (multipliée). Par exemple, la valeur de 12,456 peut être stocké dans l'entier si multiplié par 1000. Si tel est le cas:

float flv; 
int intv = 12456; 

flv = (float)intv/1000.0f; 

Vous pouvez également imprimer cet entier mis à l'échelle sans convering flotter

printf("%s%d.%03d\n", intv < 0 ? "-": "", abs(intv/1000), abs(intv % 1000)); 
+0

@chux bon point –

+0

Mieux, encore envisager 'intv = -1'. Peut nécessiter quelque chose comme 'printf ("% s% d.% 03d "," - "[intv> = 0], abs (intv/1000), abs (intv% 1000))' – chux