首页 > 解决方案 > 将 16 位浮点数转换为 32 位浮点数

问题描述

我有两个不同的 DSP:

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

标签: cfloating-pointprecision

解决方案


在 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,则可以使用short16 位。

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

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

但是,它的字段 1、8 和 23 与常见的 IEEE-754 基本 32 位二进制浮点格式的字段大小相匹配,这让我怀疑它是浮点格式,而不是定点格式。在这种情况下,你可以把它变成一个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);

推荐阅读