我从四个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);
准确度如何?
答案 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_t
到float
的单次转换。
答案 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内。