0

我从代表 64 位整数的四个 16 位寄存器中读取嵌入式设备。读取函数在 uint16_t 中读取它们,我想将其转换为浮点数 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);

准确性如何?

4

2 回答 2

2

一种方法是:

#include <math.h>

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

这不需要您的嵌入式编译器提供您已经拥有的任何其他整数大小uint16_t,它只需要ldexpf().

这将计算一个float在移位整数的数学和的一个 ULP 内的 a u1,..., u4

于 2013-02-19T20:29:21.533 回答
2

这样做:

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

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

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

这将摆脱警告。

出于效率和精度的原因,最好先将 4 转换uint16_t为 single uint64_t,然后再执行一次从 uint64_tto的转换float

于 2013-02-19T20:23:08.100 回答