我从嵌入式设备读取代表64位整数的四个16位寄存器。read函数在uint16_t中读取它们,我想把它转换成32位浮点数。如果我像这样进行强制转换,我会得到警告,left shift count,>= width of type默认情况下是启用的。
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);那么准确性呢?
发布于 2013-02-20 04:23:08
这样做:
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的转换。
发布于 2013-02-20 04:29:22
一种方法是:
#include <math.h>
float numm = (float) u4 + ldexpf(u3, 16) + ldexpf(u2, 32) + ldexpf(u1, 48);这不需要嵌入式编译器提供除uint16_t之外的任何其他整数大小,它只需要ldexpf()。
这将计算在移位整数u1、…的数学和的一个ULP内的float、u4.
https://stackoverflow.com/questions/14966658
复制相似问题