我在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。 为什么会这样?
答案 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 是一个关于此问题以及其他方法的链接。