c - 将 16 位浮点数转换为 32 位浮点数
问题描述
我有两个不同的 DSP:
- 第一个输出 16 位浮点值,其中 1 位用于符号,7 位用于整数,8 位用于小数部分。
- 第二个将浮点数视为 32 位值,其中符号位为 8 位,整数为 8 位,小数部分为 23 位。
我想将我的第一个 DSP 的输出转换为第二个 DSP 使用的 32 位浮点格式。C中有任何API吗?
解决方案
在 C 中没有用于此的标准例程。
如果第一个 DSP 格式只是评论中讨论的 Q7.8,那么您可以使用以下命令将其转换为浮点:
#include <stdint.h>
…
int16_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
float Float = Temp * 0x1p-8f;
这只是将这些位放入一个带符号的 16 位整数,然后将其转换为float
并缩放为 8 个小数位。
0x1p-8f
float
是值为 2 −8的常数的十六进制浮点表示法。如果您的编译器不支持,您可以/ 256.f
使用* 0x1p-8f
.
如果您的编译器不支持int16_t
,则可以使用short
16 位。
如果第二个是 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);
推荐阅读
- javascript - 如何使用 Jest 测试 Json.parse
- sql-server - 使用 CASE 表达式的语法错误 - 无法弄清楚
- mysql - 有没有更好的方法将 LIKE 用于 MYSQL 中的多个值?
- javascript - 通过数组选择要附加到谷歌表格中的特定行
- mysql - 我想从nodejs的mysql数据库中获取表列表
- python-3.x - 如何在张量流中导入张量形状
- android - 无法将诺基亚 6.1 Plus 连接到 Android Studio 以运行应用程序
- docker-compose - 如何从 Azure Pipeline 中的 Docker Compose Task 获取多容器应用程序的 URL?
- apache-spark - Spark Container 中的 Fluent-bit
- arrays - 如何将数组合并为一个