STM32
直播中

杨杰

8年用户 1209经验值
私信 关注
[问答]

关于stm32 unsigned int转float数据变化问题求解

Temp的值是2147553344 (0x80011040)数据类型是unsigned int型
Temp_float的值是2.14755328e+009数据类型是float型
SysData.ADC_VALUE的值是2147553280 数据类型是double型
现执行如下进程:

Temp = 0x80011040;
SysData.ADC_VALUE=0;
Temp_float = Temp;//到这里值传递后就变了   这是为什么?
SysData.ADC_VALUE+=Temp_float;

回帖(1)

laisvl

2024-5-8 17:18:14
在这个问题中,我们需要了解 unsigned int 到 float 的转换以及浮点数的表示方式。首先,我们来分析 Temp 的值,然后讨论为什么在将 Temp 赋值给 Temp_float 后,值发生了变化。

1. Temp 的值是 2147553344(0x80011040),数据类型是 unsigned int 型。

2. 当我们将 Temp 赋值给 Temp_float 时,实际上是在进行类型转换,从 unsigned int 转换为 float。在这个过程中,浮点数的表示方式可能会导致一些精度损失。

浮点数在计算机中通常使用 IEEE 754 标准表示。float 类型通常使用 32 位存储,分为三个部分:符号位(1 位)、指数位(8 位)和尾数位(或称为小数位,23 位)。由于 float 类型的尾数位只有 23 位,因此在转换过程中,Temp 的某些低位可能会被舍入或截断。

3. 根据你提供的信息,Temp_float 的值是 2.14755328e+009,数据类型是 float 型。这个值与 Temp 的原始值有一定的差距,这可能是由于浮点数表示的精度损失导致的。

4. 接下来,你将 Temp_float 赋值给 SysData.ADC_VALUE。SysData.ADC_VALUE 的数据类型是 double 型。double 类型通常使用 64 位存储,具有更高的精度。在这个过程中,Temp_float 的值可能会进一步舍入或调整以适应 double 类型的表示方式。

总结:在将 unsigned int 类型的 Temp 赋值给 float 类型的 Temp_float 时,由于浮点数表示的精度限制,Temp 的值可能会发生变化。这种变化可能会在后续的计算和赋值过程中进一步放大。为了避免这种精度损失,可以考虑使用更高精度的数据类型,如 double,或者在转换过程中使用适当的四舍五入或截断策略。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分