【发布时间】:2020-03-16 19:08:44
【问题描述】:
我正在编写一个程序,该程序从热敏电阻获取温度,然后需要确定它所处的温度范围,然后打开特定颜色的 LED。我遇到的问题是,当温度下降到一定范围内时,不止一个灯会亮起,而我只想要 RGB LED 的 3 个灯中的一个。
现在,我检查温度值的 if 语句是:
if (-40.0 < tempValue && tempValue < 20.5)
{
//turn blue light on
}
else if (20.5 < tempValue && tempValue < 37.3)
{
//turn green light on
}
等... 其中 tempValue 是从热敏电阻获得的温度。
在阅读了一堆关于浮点数并比较它们/相等性陈述的帖子后,我知道这样做肯定存在“常规”比较方式的问题,但我不确定如何根据具有最大值和最小值的给定范围。
【问题讨论】:
-
请注意,如果温度等于 20.5,则两个灯都不亮。请注意,20.5 可以精确表示,-40.0 也可以,但 37.3 不能精确表示。
-
您的代码几乎没有任何问题,只是您可能想用
<=替换20.5比较之一。此外,您可能需要添加一些滞后,因为在20.5附近时您会变得疯狂闪烁。 -
在打开新灯之前,您是否需要关闭任何已经打开的灯?或者,至少,如果新灯不同,请将其关闭;如果没有变化,请不要关闭再打开,以免闪烁。
-
比较似乎很好,因为你使用 else if 因此只有 1 个分支应该执行。也许问题是没有滞后,所以当温度接近 25 时,你可能会读到 24.99... 然后 25.001.. 然后再读 24.99.. 一些东西,如果程序足够快,那么两个 LED 都会闪烁。所以它可能是由噪音引起的。
-
我敢说浮点比温度测量设备的精度更高,所以只要你不触发相等事件,温度读数是
37.3还是可能无关紧要37.29999999.
标签: c floating-point comparison temperature