嵌入式C:从uint16_t转换为float?

时间:2018-12-28 03:42:55

标签: c avr

因此,我正在使用Atmega328p和MCP9808来获取一些i2c临时值。我正在将其运行到我的计算机上,并通过USART在终端中查看它。

我得到了正确的摄氏温度值(显示00022,大约是71度,这对我的房间是正确的)。

但是,当我尝试转换为华氏度时,得到的值为00054,即def。不正确。

这是我使用的公式:

In [551]: df.columns = pd.MultiIndex.from_arrays([df.columns, df.columns.to_series().groupby(df.columns).cumcount().astype(str)]).map('_'.join)

In [552]: df
Out[552]: 
   id_0  name_0  id_1
0     1       4     9
1     2       3     0
2     3       2     1

摄氏温度只是主程序中一个称为“温度”的float fahrenheitConvert(uint16_t celsius) { float fahrenheit; fahrenheit = celsius*(9/5) + 32; return fahrenheit; } 值(通过串行输出就可以了)。我想念什么吗?看来应该是简单的转换?

1 个答案:

答案 0 :(得分:2)

9/5作为截断整数数学执行,其结果为1(因为9/5丢弃小数部分为1)。因此,您的计算将简化为:

fahrenheit = celsius * (1) + 32;

或者只是:

fahrenheit = celsius + 32;

这显然没有帮助。

要解决此问题,请将其中一个文字更改为double文字,以便数学自然转换为double数学:

fahrenheit = celsius * 9 / 5.0 + 32;

现在,您可以使用整数数学来计算celsius * 9,然后在除以double时隐式强制5.0,并保留计算的小数部分。

旁注:实际上,您实际上不需要将此代码分成声明,赋值和return。该函数的主体可以简化为:

return celsius * 9 / 5.0 + 32;

它会同样有效。