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

C 将16位浮点转换为32位浮点,c,floating-point,precision,C,Floating Point,Precision,我有两个不同的DSP: 第一个输出16位浮点值,其中符号有一位,整数有7位,小数部分有8位 第二种方法将浮点视为32位值,其中符号有一位,整数有8位,小数部分有23位 我想将第一个DSP的输出转换为第二个DSP使用的32位浮点格式。C语言中有API吗?C语言中没有用于此的标准例程 如果第一种DSP格式仅为注释中讨论的Q7.8格式,则可以使用以下方法将其转换为浮点格式: #include <stdint.h> … int16_t Temp; memcpy(&Temp, &a

我有两个不同的DSP:

  • 第一个输出16位浮点值,其中符号有一位,整数有7位,小数部分有8位
  • 第二种方法将浮点视为32位值,其中符号有一位,整数有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;
但是,它的字段1、8和23与普通IEEE-754基本32位二进制浮点格式的字段大小相匹配,这让我怀疑它是浮点格式,而不是定点格式。在这种情况下,您可以使用以下方法将其设置为
浮点

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);
int16\t温度;
memcpy(&Temp,&PlaceWhereDataIs,sizeof Temp);

int32_t Result=(int32_t)Temp*(1在C中没有用于此的标准例程

如果第一种DSP格式仅为注释中讨论的Q7.8格式,则可以使用以下方法将其转换为浮点格式:

#include <stdint.h>
…
int16_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
float Float = Temp * 0x1p-8f;
但是,它的字段1、8和23与普通IEEE-754基本32位二进制浮点格式的字段大小相匹配,这使我怀疑它是浮点格式,而不是定点格式。在这种情况下,您可以使用以下方法将其转换为
浮点

float Float;
memcpy(&Float, &PlaceWhereDataIs, sizeof Float);
如果第一种DSP格式实际上是一种浮点格式,包含1个符号位、7个指数位和8个有效位,则需要进行一些转换工作。此外,您必须从文档中提供详细信息自定义浮点格式倾向于以不同的方式处理次正态、无穷大和NaN,以及非标准的ex偏见

如果两者都是定点格式,则可以使用以下方法将第一种格式转换为第二种格式:

int16_t Temp;
memcpy(&Temp, &PlaceWhereDataIs, sizeof Temp);
int32_t Result = (int32_t) Temp * (1 << 23-8);
int16\t温度;
memcpy(&Temp,&PlaceWhereDataIs,sizeof Temp);

int32_t Result=(int32_t)Temp*(1不在标准C中,不是。可能16位平台的编译器供应商提供了一些实用程序库或其他东西,这似乎是一个常见的要求。也正如其他人指出的,这些听起来像定点数字,而不是浮点数。您的术语是“小数部分”通常用于固定点。您在哪里找到16位浮点数?我想您使用的库有转换它的功能。这些听起来更像是固定点格式,而不是浮点数格式。如果是这样,您可能可以使用位移位和掩码来进行转换。您对类型的描述与浮点数的转换方式不一致类型在C标准中指定(带有符号、尾数和指数)。您的描述更类似于定点类型。@MartinR否,这显然是关于向另一个方向转换。不是在标准C中,否。可能16位平台的编译器供应商提供了一些实用程序库或其他东西,这似乎是一个常见的要求。正如其他人指出的,这些听起来像定点数字而不是浮动。你的术语是“分数部分”通常用于固定点。您在哪里找到16位浮点数?我想您使用的库有转换它的功能。这些听起来更像是固定点格式,而不是浮点数格式。如果是这样,您可能可以使用位移位和掩码来进行转换。您对类型的描述与浮点数的转换方式不一致类型在C标准中指定(带有符号、尾数和指数)。您的描述更类似于定点类型。@MartinR不,这显然是关于向另一个方向转换。我理解您的答案,我在网上找到了相同的解释,看起来不错。但是我仍然不明白。您编写的第一个示例是Q7.8浮点。如果您将Q7.8数字乘以2^-8,您将右筛选到8位,对吗?在这种情况下,您将丢失小数部分。我不理解为什么temp*2^-8可以给出正确的浮点value@lovehell:
0x1p-8f
是一个浮点常量,类型为
float
。在C语言中,当您将一个整数乘以一个
float
时,整数转换为
float
,并生成一个
float
结果。浮点类型包括一个指数,因此它们可以表示分数。我理解你的答案,我在网上找到了相同的解释,看起来很好。但是我仍然不明白。你写的第一个例子是Q7.8到float。如果你将Q7.8数字乘以2^-8,您将右键筛选到8位,对吗?在这种情况下,您将丢失小数部分。我不理解在位操作方面为什么temp*2^-8可以给出正确的浮点value@lovehell:
0x1p-8f
是一个浮点常量,类型为
float
。在C语言中,当您将整数乘以
float
,整数将转换为
float
,并生成
float
结果。浮点类型包括指数,因此可以表示分数。