首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >添加双数字时Labwindows的奇怪行为

添加双数字时Labwindows的奇怪行为
EN

Stack Overflow用户
提问于 2013-10-07 13:51:07
回答 1查看 81关注 0票数 0

我正在计时器的回调函数中运行以下代码块。

代码语言:javascript
复制
if (start_value <= end_value) 
{
   start_value += increment_value;
}
else
{
   return 0;
}

这三个变量都被定义为双变量。

代码语言:javascript
复制
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。为什么会发生这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-08 16:40:04

Eshan,==操作符正在寻找一个精确的匹配,并且应该专门用于整数比较(在可能的情况下)。所以,“为什么会发生这种事?”因为26.10000000001不等于26.1。两者之间的差异有时被称为浮点误差。

只要我们使用浮点的二进制存储,就会继续存在浮点错误。这要求比较浮点数的方法必须不同于比较整数时的方法。(即对于浮点数,不能使用(x == y) ?。在比较浮点数时,一个快速而肮脏的替代"==“的方法是这样做:if(abs(x-y)<epsilon ){//equal},其中epsilon是一些小的容忍值,比如0.000001。

所以,试一试这样的方法:

代码语言:javascript
复制
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是一个关于这个和其他方法的链接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19226677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档