嵌入式 C:从 uint16_t 转换为浮点数?
Embedded C: Converting from uint16_t to float?
所以我使用 Atmega328p 和 MCP9808 来获取一些 i2c 温度值。我 运行 它到我的电脑并通过 USART 在终端上查看它。
我得到正确的摄氏度值(它显示 00022,大约 71 度,这对我的房间来说是正确的)。
但是,当我尝试转换为华氏度时,我得到的值是 00054,即 def。不正确。
这是我使用的公式:
float fahrenheitConvert(uint16_t celsius) {
float fahrenheit;
fahrenheit = celsius*(9/5) + 32;
return fahrenheit;
}
celsius 只是主程序中一个名为 "Temperature" 的 uint16_t
值(这是通过串行打印出来的就好)。我错过了什么吗?这似乎应该是一个简单的转换?
9/5
作为截断整数数学执行,计算结果为 1
(因为 9/5
丢弃小数部分是 1
)。所以你的计算被简化为:
fahrenheit = celsius * (1) + 32;
或者只是:
fahrenheit = celsius + 32;
这显然没有帮助。
要修复,请将其中一个文字更改为 double
文字,以便数学自然地转换为 double
数学:
fahrenheit = celsius * 9 / 5.0 + 32;
现在您使用整数数学计算 celsius * 9
,然后在除以 5.0
时隐式强制转换为 double
,保留计算的小数部分。
旁注:您实际上不需要将这段代码分成声明、赋值和 return
。这个函数的主体可以简化为:
return celsius * 9 / 5.0 + 32;
而且它会同样有效。
所以我使用 Atmega328p 和 MCP9808 来获取一些 i2c 温度值。我 运行 它到我的电脑并通过 USART 在终端上查看它。
我得到正确的摄氏度值(它显示 00022,大约 71 度,这对我的房间来说是正确的)。
但是,当我尝试转换为华氏度时,我得到的值是 00054,即 def。不正确。
这是我使用的公式:
float fahrenheitConvert(uint16_t celsius) {
float fahrenheit;
fahrenheit = celsius*(9/5) + 32;
return fahrenheit;
}
celsius 只是主程序中一个名为 "Temperature" 的 uint16_t
值(这是通过串行打印出来的就好)。我错过了什么吗?这似乎应该是一个简单的转换?
9/5
作为截断整数数学执行,计算结果为 1
(因为 9/5
丢弃小数部分是 1
)。所以你的计算被简化为:
fahrenheit = celsius * (1) + 32;
或者只是:
fahrenheit = celsius + 32;
这显然没有帮助。
要修复,请将其中一个文字更改为 double
文字,以便数学自然地转换为 double
数学:
fahrenheit = celsius * 9 / 5.0 + 32;
现在您使用整数数学计算 celsius * 9
,然后在除以 5.0
时隐式强制转换为 double
,保留计算的小数部分。
旁注:您实际上不需要将这段代码分成声明、赋值和 return
。这个函数的主体可以简化为:
return celsius * 9 / 5.0 + 32;
而且它会同样有效。