在c中将int64转换为float32

时间:2013-02-19 20:21:53

标签: c floating-point int type-conversion

我从四个16位寄存器中读取嵌入式设备,这些寄存器代表64位整数。 read函数在uint16_t中读取它们,我想将它转换为float 32.如果我这样做,我会收到警告左移位数> =类型宽度[默认启用]。

uint16_t u1,u2,u3,u4;
u1=readregister();
u2=readregister();
u3=readregister();
u4=readregister();

float num11 = (float) (u1 << 48);       
float num22 = (float) (u2 << 32); 
float num33 = (float) (u3 << 16);   
float num44 = (float) u4;   
float numm= num11+num22+num33+num44;
printf("%f\n", numm);

准确度如何?

2 个答案:

答案 0 :(得分:2)

这样做:

float num11 = (uint64_t) u1 << 48;
/* ... */

如果编译器因uint64_t转换为float而发出警告(C不需要),则可以添加额外的float强制转换:

float num11 = (float) ((uint64_t) u1 << 48);

这将消除警告。

出于效率和精确原因,最好先将您的4 uint16_t转换为单uint64_t,然后执行从uint64_tfloat的单次转换。

答案 1 :(得分:2)

一种方法是:

#include <math.h>

float numm = (float) u4 + ldexpf(u3, 16) + ldexpf(u2, 32) + ldexpf(u1, 48);

这不要求您的嵌入式编译器提供除uint16_t之外的任何其他整数大小,它只需要ldexpf()

这会计算float,它位于移位整数u1,...,u4的数学和的一个ULP内。