Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何检查值是否在两个浮点数之间?_C_Floating Point_Comparison_Temperature - Fatal编程技术网

C 如何检查值是否在两个浮点数之间?

C 如何检查值是否在两个浮点数之间?,c,floating-point,comparison,temperature,C,Floating Point,Comparison,Temperature,我正在编写一个程序,从热敏电阻获得一个温度,然后需要确定它的温度范围,然后打开一个特定的彩色LED。我遇到的问题是,当温度下降到一定范围时,会有多个灯亮起,而我只需要RGB LED的三个灯中的一个 现在,我检查温度值的if语句是: if (-40.0 < tempValue && tempValue < 20.5) { //turn blue light on } else if (20.5 < tempValue && tempVal

我正在编写一个程序,从热敏电阻获得一个温度,然后需要确定它的温度范围,然后打开一个特定的彩色LED。我遇到的问题是,当温度下降到一定范围时,会有多个灯亮起,而我只需要RGB LED的三个灯中的一个

现在,我检查温度值的if语句是:

if (-40.0 < tempValue && tempValue < 20.5)
{
    //turn blue light on
}

else if (20.5 < tempValue && tempValue < 37.3)
{
    //turn green light on
}
if(-40.0
等等。。。其中,tempValue是从热敏电阻获得的温度

在阅读了大量关于浮点的文章并比较了它们/等式语句之后,我知道用“常规”的比较方式进行比较肯定有问题,但我不确定如何根据给定的范围和最大值和最小值来检查温度

如何根据给定的最大和最小值(?)范围检查温度

我只想从RGB LED中选择其中一个

如果N种颜色中只有1种是理想的结果,并且范围显然是相邻的,我建议使用边界列表,而不是最小/最大对。这很容易确保只选择一种颜色,并防止“多个灯亮起”

那么边界是-40.0,20.5,37.3

#include <math.h>

int TemperatureToColor(double tempValue) { 
  const double Temperature Limit[] = {-40.0, 20.5, 37.3, HUGE_VAL};
  size_t n = sizeof Limit/sizeof Limit[0];
  // Assume if less than -40.0, use red.  
  // Assume if more than 37.3, also use red.  
  const int color[n] = {RED, BLUE, GREEN, RED};
  for (size_t i = 0; i<n; i++) {
    if (tempValue <= Limit[i]) {
      return color[i];
    }
  }
  return BLACK;  // tempValue is not-a-number, or maybe RED in this odd case
}
#包括
int TemperatureToColor(双温度值){
常数双温度限值[]={40.0,20.5,37.3,巨大值};
size_t n=sizeof Limit/sizeof Limit[0];
//假设小于-40.0,则使用红色。
//假设大于37.3,也使用红色。
const int color[n]={红、蓝、绿、红};
对于(尺寸i=0;i
如何根据给定的最大和最小值(?)范围检查温度

我只想从RGB LED中选择其中一个

如果N种颜色中只有1种是理想的结果,并且范围显然是相邻的,我建议使用边界列表,而不是最小/最大对。这很容易确保只选择1种颜色,并防止“多个灯光打开”

那么边界是-40.0,20.5,37.3

#include <math.h>

int TemperatureToColor(double tempValue) { 
  const double Temperature Limit[] = {-40.0, 20.5, 37.3, HUGE_VAL};
  size_t n = sizeof Limit/sizeof Limit[0];
  // Assume if less than -40.0, use red.  
  // Assume if more than 37.3, also use red.  
  const int color[n] = {RED, BLUE, GREEN, RED};
  for (size_t i = 0; i<n; i++) {
    if (tempValue <= Limit[i]) {
      return color[i];
    }
  }
  return BLACK;  // tempValue is not-a-number, or maybe RED in this odd case
}
#包括
int TemperatureToColor(双温度值){
常数双温度限值[]={40.0,20.5,37.3,巨大值};
size_t n=sizeof Limit/sizeof Limit[0];
//假设小于-40.0,则使用红色。
//假设大于37.3,也使用红色。
const int color[n]={红、蓝、绿、红};
对于(尺寸i=0;i
应该是唯一打开的,但是所有的灯都打开了,所以它看起来是白色的(带蓝色)

噪声是造成这种情况的一个常见因素。LED的RGB灯开启时间可以持续到启用后。在温度读数不稳定的情况下,当接近转换点时,绿色/蓝色会连续快速开启/关闭。即使只有一个灯开启,但在光学上显示为多个灯开启。还有人眼持续这又增加了一点

解决方案包括:

  • 将采样率降低至1.0赫兹,以限制LED变化率

  • 为颜色选择添加滞后。一旦选择颜色,温度变化必须比颜色变化所考虑的颜色范围多1.0度

  • 低通过滤器:不使用原始温度读数,而是使用最后M个样本的运行平均值

  • 上述组合:一旦颜色发生变化,它至少会保持该颜色一段时间(例如1.0秒),除非温度变化非常剧烈(例如超出范围5度)。在该最短时间后,表现正常

我想关于RED的问题是由于错误的未上市代码造成的

应该是唯一打开的,但是所有的灯都打开了,所以它看起来是白色的(带蓝色)

噪声是造成这种情况的一个常见因素。LED的RGB灯开启时间可以持续到启用后。在温度读数不稳定的情况下,当接近转换点时,绿色/蓝色会连续快速开启/关闭。即使只有一个灯开启,但在光学上显示为多个灯开启。还有人眼持续这又增加了一点

解决方案包括:

  • 将采样率降低至1.0赫兹,以限制LED变化率

  • 为颜色选择添加滞后。一旦选择颜色,温度变化必须比颜色变化所考虑的颜色范围多1.0度

  • 低通过滤器:不使用原始温度读数,而是使用最后M个样本的运行平均值

  • 上述组合:一旦颜色发生变化,它至少会保持该颜色一段时间(例如1.0秒),除非温度变化非常剧烈(例如超出范围5度)。在该最短时间后,表现正常


我想关于红色的问题是由于错误的未列出代码造成的。

注意,如果温度等于20.5,两个灯都不会亮。请注意,20.5可以精确表示,正如-40.0一样,但37.3不能精确表示。您的代码几乎没有问题,只是您可能需要替换一个
20.5
comparisons with
在打开新灯光之前,是否需要关闭任何已打开的灯光?或者,如果新灯光不同,至少要关闭它;如果新灯光不变,则不要先关闭然后再打开以避免闪烁。比较似乎很好,因为您使用了else if,因此只应执行一个分支。问题可能是缺少hY设置,所以当温度接近25时,你可以读取24.99…然后25.001…然后再读取24.99…如果程序足够快,那么两个led都会闪烁。所以这可能是由噪声引起的。我敢说,浮点比温度测量设备具有更高的精度,只要你不触发一个相等的事件,它就会闪烁s温度读数是否
37.3可能无关紧要<