我正在计时器的回调函数中运行以下代码块。
if (start_value <= end_value)
{
start_value += increment_value;
}
else
{
return 0;
}这三个变量都被定义为双变量。
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。为什么会发生这种情况?
发布于 2013-10-08 16:40:04
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值来匹配您将要进行的比较中重要数字的邻域。
还有很多其他的好方法(很多人会说这不是其中之一),但我已经用了好几年了,为了我的目的,它运行得很好。
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm是一个关于这个和其他方法的链接。
https://stackoverflow.com/questions/19226677
复制相似问题