将16位浮点转换为32位浮点

时间:2018-04-26 07:36:59

标签: c floating-point precision

我有两种不同的DSP:

  • 第一个输出16位浮点值,其中有一个用于符号的位,7位用于整数,8位用于小数部分。
  • 第二个认为浮点为32位值,其中有一个符号位,整数为8位,小数部分为23位。

我想将第一个DSP的输出转换为第二个DSP使用的32位浮点格式。 C中有任何API吗?

1 个答案:

答案 0 :(得分:2)

C中没有标准例程。

如果第一个DSP格式只是评论中讨论的Q7.8,那么你可以将它转换为浮点数:

#include <stdint.h>
…
int16_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
float Float = Temp * 0x1p-8f;

这只是将这些位置于有符号的16位整数中,然后将其转换为float并将其缩放为8个小数位。

0x1p-8ffloat常量的十六进制浮点表示法,值为2 -8 。如果您的编译器不支持,则可以使用/ 256.f代替* 0x1p-8f

如果您的编译器不支持int16_t,如果是16位,则可以使用short

如果第二个是Q8.23,那么它可以类似地转换为:

int32_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
float Float = Temp * 0x1p-23f;

但是,它的1,8和23字段与通用IEEE-754基本32位二进制浮点格式的字段大小相匹配,这使我怀疑它是浮点格式,而不是固定格式 - 点格式。在这种情况下,您可以使用:{/ p>将其转换为float

float Float;
memcpy(&Float, &PlaceWhereDataIs, sizeof Float);

如果第一个DSP格式实际上是一个带有1个符号位,7个指数位和8个有效位的浮点格式,那么转换它需要一些工作。此外,您必须提供文档中的详细信息 - 自定义浮点格式倾向于以不同方式处理次正规,无穷大和NaN,以及具有非标准指数偏差。

如果两者都是定点格式,您可以将第一个转换为第二个:

int16_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
int32_t Result = (int32_t) Temp * (1 << 23-8);