两个浮点加法不改变结果

时间:2017-08-30 08:51:10

标签: c floating-point add precision

#include<stdio.h>

int main()
{

    int loopCounter = 0;    
    float data1,data2;

    data1 = 2000.0f;
    data2 = 0.0001f;

    while(1)
    {               
      data1 = data1 + data2;
      printf("Loop Counter %d , Data %f\n",loopCounter,data1);
      loopCounter++;
    }
    return 0;
}

我正在使用GCC编译器在Linux机器上运行此代码,但如果2 float的添加达到值2048.0,则它不再更改。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:4)

对于任何浮点值,结合(更多)较小的添加增量,有一个值,从中添加增量值得到的结果是类似的&#34;类似的&#34;到前一个,float中的表示是相同的。

您的代码实际上是为了找到该值而量身定制的。

因此,在首次将delta添加到2000并且一些后续值导致可见更改时,您的代码迟早(实际上很快)会达到特殊值。我假设你的情况是2048年 2048.02048.0001在浮点数中没有不同的表示形式。因此,添加对变量没有影响。

答案 1 :(得分:2)

  

任何人都知道为什么会这样?

由于浮点精度。

阅读Ranges of floating point datatype in C?

请注意:

 2000.0001

已超过 float可以存储的限制(IEEE-754单精度约为7位)。

在您的情况下会发生的情况是精度有限,这会导致您报告的“暂停”问题。换句话说,在某个点之后,adition没有任何实际效果(反映给用户)。

我的意思是新的总和如此接近到前一个总和,它们的浮点表示是相同的,导致data1存储相同的值。

你的机器中,这个值是2048,所有其余的加上小的δ都不会影响data1的浮动表示。