添加DOUBLE数字时Labwindows奇怪的行为

时间:2013-10-07 13:51:07

标签: c floating-point comparison double labwindows

我在CALLBACK函数中运行以下代码块以用于计时器。

if (start_value <= end_value) 
{
   start_value += increment_value;
}
else
{
   return 0;
}

所有三个变量都定义为DOUBLE。

Double start_value = 26.0;
Double end_value = 28.0;
increment_value = 0.1;

将increment_value添加到start_value时,变量start_value的值不会简单地反映添加的预期结果。例如,当start_value为26.0时,在一次添加之后,start_value的值为26.10000000001。尾部1会在代码中导致问题,因为当预期比较的预期结果为TRUE时,由于尾随1,它将被评估为false。 为什么会这样?

1 个答案:

答案 0 :(得分:0)

Eshan,==运算符正在寻找完全匹配,并且应该专门用于整数比较(其中完全是可能的)。所以,“为什么会这样?”因为26.10000000001不等于26.1。两者之间的差异有时被称为浮点错误。

只要我们使用浮点二进制存储,就会继续出现浮点错误。这要求比较浮点的方法必须与比较整数时的方法不同。 (即对于浮点数,不能使用(x == y) ?。比较浮点数时,快速而又脏的“==”替代方法是执行以下操作:if(abs(x-y)<epsilon ){//equal}其中epsilon是一些小的容差值,如0.000001

所以,尝试这样的事情:

int main(void)
{
    double start_value = 26.0;
    double end_value = 28.0;
    double increment_value = 0.1;

    #define EPSILON 0.000001  

    while(fabs(start_value-end_value)>EPSILON )
    {
          printf("not equal\n");
          start_value += increment_value;
    }
    printf("equal\n");
    getchar();  
}

注意: 选择epsilon值以匹配您将要执行的比较中的有效数字邻域。

还有许多其他好的方法,(很多人会说这不是其中之一),但我已经使用了这个方法多年了,而且就我的目的而言,它运作良好。
HERE 是一个关于此问题以及其他方法的链接。